欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2020网鼎杯复现 re jocker wp

程序员文章站 2022-05-19 10:49:23
...

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

2020网鼎杯复现 re jocker wp

options——general:

2020网鼎杯复现 re jocker wp

2020网鼎杯复现 re jocker wp

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

2020网鼎杯复现 re jocker wp

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

2020网鼎杯复现 re jocker wp

关键函数: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
2020网鼎杯复现 re jocker wp

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

2020网鼎杯复现 re jocker wp

逻辑比较清晰,首先是把输入的内容和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()点进去查看:

2020网鼎杯复现 re jocker wp

2020网鼎杯复现 re jocker wp

这个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动态调试,可以仔细去看看
还是要再多练一练看汇编的能力呀....

相关标签: RE