这道题很有意思
解题很简单,但是里面有一个小hook
解题
逻辑十分简单 就是将命令行输入的字符串参数比较
字符串直接显示 一看就没这么简单 运行输入果然显示Wrong
估计是存在加密,main函数中没有调用其他函数,想到可能存在hook
gdb动调单步调试的时候可以发现调用strcmp函数直接跳入了函数——0x6ea
0x6ea就是加密函数
第一个参数是输入值 第二个参数是
zer0pts{********CENSORED********}
猜想201090是hook之后的cmp函数 加密过程就是将输入值减去字符串201060
再与第二个参数比较 dump出数据后反过来加就能推出输入
要注意有的字节大于127 是以补码形式存在的负数 需要另行还原
a=[66, 9, 74, 73, 53, 67, 10, 65, 240, 25, 230, 11, 245, 242, 14, 11, 43, 40, 53, 74, 6, 58, 10, 79]
b=[42, 42, 42, 42, 42, 42, 42, 42, 67, 69, 78, 83, 79, 82, 69, 68, 42, 42, 42, 42, 42, 42, 42, 42]
f=''
for i in range(24):
if a[i]<127:
f+=chr(a[i]+b[i])
else:
f+=chr(b[i]-(((~(a[i]))&0xff)+1))
print(f)
得到结果
zer0pts{l3ts_m4k34DDSOUR_t0d4y}
原理
接下来瞧一瞧这个hook是如何实现的
main函数十分朴素 加密函数也没有任何交叉引用
还好程序规模不大 挨个函数看一看发现函数795有戏
这里看到201090地址直接赋值为strcmp函数的地址
这个函数存在于函数表889中
而889被函数init调用
这就说得通了 init是再main函数之前运行的初始化函数 程序在这里进行了hook
init函数对函数表889遍历 第一个函数6e0没有对相关变量进行更改
重新看下函数795
201090是我们刚刚在函数EA0中看到的最后return的函数 这里把他地址改变为strcmp的地址
201082双击跟进发现他是库函数表中strcmp函数的地址 将其改变为6EA函数的地址 实现hook