Search

[HackCTF] g++

Tags
pwnable
Category
HackCTF
Create Time
2022/01/07 12:50

1. 문제

NX 비트가 걸려있는 것을 확인 할 수 있다
프로그램을 실행시키면 다음과 같은 문구가 뜨고 입력할 수 있는 공간이 뜬다
그리고 So, + 입력한 문자열이 나온다.
코드를 한번 봐보자
메인 함수는 별게 없다. Vuln함수를 봐보자
vuln 함수는 다음과 같다. c++ 코드로 되어 있는것 같은데 굉장히 복잡해 보인다.
우선 s변수에 fgets로 값을 입력받는다.
그리고 get_flag 함수가 있는데 이거를 실행시켜야 플래그를 획득할 수 있을 것같다
흐름을 보쟈면, fgets 함수와 strcpy 함수를 이용하여 bof를 일으키고, get_flag 함수를 실행시키면 될것같다

2. 접근방법

코드를 보면 처음에 입력한 값이 s에 들어가고 그걸 input에 복사한다
그다음 v5에 "you", v7에 "I"를 넣고
replace 함수를 이용하여 v4에 input, v7 변수를 인자로 하여 "I"를 "you"로 변경시킨다
그렇다면, 처음에 fgets는 32바이트 크기만 입력을 받으므로, ret 주소까지의 거리인 ebp-3Ch , 즉 64바이트 크기만큼 입력을 못한다
하지만 replace 함수를 통하여 I 가 you 로 변경되기 때문에 이를 이용하면 될 것이다
정리하면
ret까지 필요한 크기 : 64byte
페이로드 : I * 21 == you * 21 = 63 여기에 + 1byte(아무값)
이렇게 입력하면 될 것이다

3. 풀이

최종 익스 코드는 다음과 같다
from pwn import * p = remote("ctf.j0n9hyun.xyz",3011) #p.recvuntil("Tell me something about yourself:") #p.recv(34) payload = "A" payload += "I"*21 payload += p32(0x08048F0D) p.sendline(payload) p.interactive()
C
복사
recvuntil() 사용하면 중간에 멈추고 진행이 안된다. 이는 서버 오류인듯 싶다

4. 몰랐던 개념

c++ 아이다 코드에 익숙해져야겠다