Youngter-drive
exe文件,查壳:
发现是UPX壳,然后脱壳:
拖入IDA:
跟进,跳转到交叉引用列表:
确定,然后F5查看伪代码:
分析,多线程,第一个线程h0bject会执行StartAddress函数,第二个线程v2执行sub_41119f函数,然后挨个分析打开StartAddress函数
原因就是堆栈不平衡利用ida调堆栈就好:
在红色部分用alt+p,打开:
(需要打开堆栈指针)
更改以后,就可以正常打开函数;
逻辑就出现了,然后有坑的地方出现了,它是两个线程同时工作的,所以要交替处理数据,看另一个线程,发现没有处理任何数据
然后写脚本:
dec = "TOiZiZtOrYaToUwPnToBsOaOapsyS"
flag = ''
result = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
for i in range(len(dec)):
if i % 2 == 0:
flag += dec[i]
continue
if(dec[i].isupper()):
flag += chr(result.find(dec[i]) + 96)
else:
flag += chr(result.find(dec[i]) + 38)
print ('flag{'+flag+'}')
运行得到:
得到flag{ThisisthreadofwindowshahaIsES},不过我们输入的是30个字符,这里flag里面只有29个字符,最后一个字符应该都可以,不过正确答案是E,大不了一个个试就行。
flag{ThisisthreadofwindowshahaIsESE}
[WUSTCTF2020]level2
查壳:
32位,但是有UPX壳,脱壳:
脱壳之后,拖入IDA:
查看main函数:
这里我们得到flag:wctf2020{Just_upx_-d}
但是如果提交就会发现是不正确的,但是题目介绍上说,裹上flag提交,然后得到
flag{Just_upx_-d}
[GWCTF 2019]xxor
查壳:
无壳,64位,拖入IDA:
然后再函数窗口搜索main函数:
在查看伪代码:
在查看关键函数:
还有一个关键点:
查看sub_400686函数:
可以得到:
xorm[0] = 3746099070;
xorm[1] = 550153460;
xorm[2] = 3774025685;
xorm[3] = 1548802262;
xorm[4] = 2652626477;
xorm[5] = 2230518816;
然后脚本:
#include <stdio.h>
int main()
{
unsigned int xorm[6];
xorm[0] = 3746099070;
xorm[1] = 550153460;
xorm[2] = 3774025685;
xorm[3] = 1548802262;
xorm[4] = 2652626477;
xorm[5] = 2230518816;
int i = 0,j=0,sum;
unsigned int temp[2] = {0};
unsigned int data[4] = { 2,2,3,4 };
for (i = 0; i < 5; i += 2)
{
temp[0] = xorm[i];
temp[1] = xorm[i + 1];
sum = 0x458BCD42 * 64;
for (j = 0; j < 64; j++)
{
temp[1] -= (temp[0] + sum + 20) ^ ((temp[0] << 6) + 3) ^ ((temp[0] >> 9) + 4) ^ 0x10;
temp[0] -= (temp[1] + sum + 11) ^ ((temp[1] << 6) + 2) ^ ((temp[1] >> 9) + 2) ^ 0x20;
sum -= 0x458BCD42;
}
xorm[i] = temp[0];
xorm[i + 1] = temp[1];
}
for (i = 0; i < 6; i++)
printf("%x",xorm[i]);
}
运行得到:
再转化为字符串:
最后得到:
flag{re_is_great!}