【BUUCTF逆向题】[WUSTCTF2020]level1、[GUET-CTF2019]re
一.[WUSTCTF2020]level1
打开文件夹一个无后缀文件一个txt输出文档
文件放入WinHex发现是ELF程序,用Exeinfo查看64位无壳
丢入IDA64,main函数F5反编译后阅读程序
先将flag文件的内容赋值到第三方数组中然后根据数据所在序号是奇数偶数分别使用不同的处理方式输出
补充:
& 按位与运算:将数据转换为二进制然后逐位比较,都是1则为1否则为0:,“全真则真,一假则假”;
<< 左移运算符,二进制数据所有向左移一位,右边补0(正数,负数不同),这里数据都是正数,所以**>>** 右移运算符可以作为逆向运算符
写逆向脚本:
output = [198, 232, 816, 200, 1536, 300, 6144, 984, 51200, 570, 92160, 1200, 565248, 756, 1474560, 800, 6291456, 1782, 65536000]
flag_chars = []
for i in range(1, 20):
if i % 2 != 0: # i 为奇数
ptr_i = output[i - 1] >> i
else: # i 为偶数
ptr_i = output[i - 1] // i
flag_chars.append(chr(ptr_i))#记得将整数转换为字符
# 尝试将结果转换为字符串
try:
flag = ''.join(flag_chars)
print("推测的 flag 内容为:", flag)
except ValueError:
print("无法将结果转换为有效的字符串,请检查输出或数据。")
得到ctf2020{d9-dE6-20c}
二.[GUET-CTF2019]re
无后缀文件用WinHex打开发现是ELF开头即Linux下可执行程序
Exeinfo发现64位有upx壳
超级巡警只能脱PE文件(Windows下可执行程序)壳,所以用kali的upx工具脱壳
脱壳完用IDA64打开发现没有main 函数,函数栏好多其他函数,先用Shift+F12查看字符串有没有可疑线索
发现关键语句直接Ctrl+X交叉定位进入关键函数
就是输入flag然后判断是否正确
注意:这里不是越界输入,因为没有地址,上面的printf和scanf的多余变量都是作为控制输入,比如缓冲区大小,比如结束输入标志等,反正不用管。
补充:函数太多可以重命名方便观察,如下
接着进入关键函数key
通过阅读可以发现就是对输入传入参数v11也就是我们输入变量的约束验证,通过这些就可以反推出v11也就是输入的正确flag
补充:据说这是典型z3约束器求解题但是我不认识也不会,所以一个个手算就行
注意:这里没有v11[6]的信息,反正就1个字符,所以可以自己爆破
先给出逆向脚本
a1 = chr(166163712 // 1629056)
a2 = chr(731332800 // 6771600)
a3 = chr(357245568 // 3682944)
a4 = chr(1074393000 // 10431000)
a5 = chr(489211344 // 3977328)
a6 = chr(518971936 // 5138336)
a8 = chr(406741500 // 7532250)
a9 = chr(294236496 // 5551632)
a10 = chr(177305856 // 3409728)
a11 = chr(650683500 // 13013670)
a12 = chr(298351053 // 6088797)
a13 = chr(386348487 // 7884663)
a14 = chr(438258597 // 8944053)
a15 = chr(249527520 // 5198490)
a16 = chr(445362764 // 4544518)
a17 = chr(981182160 // 10115280)
a18 = chr(174988800 // 3645600)
a19 = chr(493042704 // 9667504)
a20 = chr(257493600 // 5364450)
a21 = chr(767478780 // 13464540)
a22 = chr(312840624 // 5488432)
a23 = chr(1404511500 // 14479500)
a24 = chr(316139670 // 6451830)
a25 = chr(619005024 // 6252576)
a26 = chr(372641472 // 7763364)
a27 = chr(373693320 // 7327320)
a28 = chr(498266640 // 8741520)
a29 = chr(452465676 // 8871876)
a30 = chr(208422720 // 4086720)
a31 = chr(515592000 // 9374400)
a32 = chr(719890500 // 5759124)
print(a1,a2,a3,a4,a5,a6,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,sep='')
#flag{e65421110ba03099a1c039337}
注意:这里可以除不尽就会导致chr报错,所以可以用int()转换除/后的结果,也可以用//运算符就是整除
然后爆破第7位是1
最终flag{e654211110ba03099a1c039337}