2020网鼎杯 jocker wp(buu复现)

f5之后发现,程序堆栈不平衡,不能直接反编译

options——general:

在0x401833这里改栈指针偏移,改成0,改成功之后就可以f5反编译了

可以看到主函数的逻辑还是比较简单的:

关键函数:wrong()  omg()  encrypt()

首先点进去wrong()函数,就是做一个加密,i 是偶数的时候进行异或操作,i 是奇数的时候进行减法操作
其次omg()函数,与所给字符串进行比较,这里直接上个小脚本:

s=[102, 107, 99, 100, 127, 97, 103, 100, 59, 86, 107, 97, 123, 38, 59, 80, 99, 95, 77, 90, 113, 12, 55, 102]
out=[]
for i in range(0,24):
    if i&1 :
        s[i]+=i
        out.append(s[i])
    else:
        s[i]^=i
        out.append(s[i])
for i in out:
    print(chr(i),end='')

得到结果明显是个假flag......flag{fak3_alw35_sp_me!!}

行吧,然后就再看看这个encrypt()函数,关键应该就在这里了,f5发现无法反编译
那就拖进od动态调试一下,在0x401833这里下个断点,执行到这里步入,然后ollydump一下程序形成新的exe

ida反编译一下新的exe,看下函数内部结构:

逻辑比较清晰,首先是把输入的内容和hahahaha_do_you_find_me?这个字符串进行异或19个字节,然后和v2全局变量进行比较,上脚本:

ans=[]
v2=[14, 13, 9, 6, 19, 5, 88, 86, 62, 6, 12, 60, 31, 87, 20, 107, 87, 89, 13]
str1='hahahaha_do_you_find_me?'
for i in range(0,19):
    ans.append(ord(str1[i])^v2[i])
for i in ans:
    print(chr(i),end='')

得到:flag{d07abccf8a410c
发现不全,找到主函数点进去看其他函数,找到sub_40159A()点进去查看:

这个v9是随机的,就觉得这个函数挺奇怪的,那这个就靠猜了....
因为flag最后一位肯定是" } ",是固定的,然后就写个异或脚本吧:

a = [0x25,0x74,0x70,0x26,0x3a]

b = ''
for i in a:
    b += chr(i ^ 71)

print(b)

得到:b37a}
完整拼接后得到flag{d07abccf8a410cb37a}


总结:
整个程序其实逻辑上不算特别难懂;
自己看汇编的能力还是有点差的;
其实这题最开始可以选择不改堆栈指针,直接去看汇编确定函数结构
后面也可以选择不选择ollydump,步入看函数逻辑,改假的flag内存使得整个程序走到finally函数然后再继续调试
传送门
还翻到了其他大佬的博客,前面分析函数差不多,后面用了ida动态调试,可以仔细去看看
还是要再多练一练看汇编的能力呀....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值