Youngter-drive
步骤:
- 例行查壳儿,32位程序,upx壳儿
- 利用网上找的upx脱壳儿工具脱完壳扔进ida,首先检索程序里的字符串,发现了有关flag的字样,跟进,当source=TOiZiZtOrYaToUwPnToBsOaOapsyS的时候才会输出flag
- 从main函数开始看程序
函数创建了两个进程,一个startaddress,一个sub_41119F
4. 先看startaddress
到sub_411940这里报错了
转汇编看一下,这边由于堆栈不平衡所以报错了
这边将411a03处修改一下,前面加个符号即可,在按f5
找到了加密函数,这是将字符串进行了替换,当字符是大写字母时,替换为off_418000处-38,小写则替换为-96
用来加密的字符串QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm
5. 再看第二个线程sub_41119F
这个进程,好像没什么用,但它运行了–dword_418008,让计数器又减了1,并且可以看出是hObject、v1地交替运行,从而导致加密函数变成隔一个加密
6. 然后是 sub_411190()函数
加密后的字符串是TOiZiZtOrYaToUwPnToBsOaOapsyS
逆向解密一下我们输入的字符串
off_418000 = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
off_418004 = "TOiZiZtOrYaToUwPnToBsOaOapsyS"
flag=''
for i in range(len(off_418004)):
if i %2 == 0:
flag += off_418004[i]
continue
for j,k in enumerate(off_418000):
if off_418004[i] == k:
if chr(j+38).isupper():
flag += chr(j+38)
else:
flag += chr(j+96)
print flag
然后这边有一个坑,doword_418008的初始值是0x1D(29),下标是29,也就说数据长度是30
我们需要再得到的字符串后面在加一位,buu上需要加E
flag{ThisisthreadofwindowshahaIsESE}