攻防世界逆向高手题之re2-cpp-is-awesome

99 篇文章 36 订阅

攻防世界逆向高手题之re2-cpp-is-awesome

继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向高手题的re2-cpp-is-awesome
在这里插入图片描述

下载附件,照例扔入exeinfope中查看信息:
在这里插入图片描述
64位ELF文件,无壳,运行一下查看主要显示字符串:
在这里插入图片描述

照例扔入IDA中查看伪代码,有main函数看main函数:

C++面向对象的代码有点乱,也有点杂,在string中追踪Better luck next time字符串跟踪出在下图的第一个红框处:
在这里插入图片描述
在这里插入图片描述

C++代码比较陌生,但是根据前面做题中积累的经验中在长类名静态调用的最后一个是要使用的函数名,比如std::__cxx11::basic_string<char,std::char_traits,std::allocator>::begin调用的就是begin这个函数。

所以开始分析:(这里积累第一个经验)
第一个红框中把用户命令行输入的a2赋值给了v3。
第二个红框用的是cout函数,输出Usage这个字符串。
第三个红框不明觉厉。
第四个红框allocator(&v13, a2, a3);应该是把a2的内容赋值给了v13。
第五个红框basic_string(v12, a2[1], &v13);应该是把v13赋值给了V12。
第六、七个红框应该是v11取v12字符串的开头begin(v12)。
第八、九个红框应该是v14取v12的结尾end(v12)。
在这里插入图片描述
接着往下分析:
先看这里分析跳出循环的条件,一开始我也不知道v14是字符串的结尾,所以很被动,现在知道了。

(这里积累第二个经验)
这里第一个红框sub_400D3D函数是取v11和v14比较,v14前面说过取输入字符串最后一个字符,而v11在第二个红框中sub_400D7A(v11)是向后取v11一个字符,所以这个if是判断当前字符是否为输入的最后一个字符,如果是就跳出循环。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

继续往下走:
第一个红框是v9取v11当前的字符。
第二个红框是用v9和两个嵌套数组off_6020A0[dword_6020C0[v15]]作比较,dword_6020C0[v15]作为off_6020A0的下标取字符。
第三个红框是v5的递增操作。
在这里插入图片描述

所以逻辑很明显了,逆向数组即可先找到off_6020A0数组:
在这里插入图片描述
然后打印dword_6020C0数组:

(这里积累第三个经验)
这里有个align 8,align num是让后面的字节都对齐num,也就是这里都对齐8才对,中间补7个0。可是这里下一个数和上一个数明明间隔4而已!后来查了很多资料才发现是IDA自动把多个0判断成对齐操作了,这里align 8是因为前面dd 24h中本来是db 24 0 0 0 然后后面一个双字是dd 0 也就是db 0 0 0 0,IDA把这连着的7个0当成了间隔,那上一个数和下一个数间隔就是8了,所以IDA生成了align 8。我们只要鼠标右键undefine或把上面的dd 24改一下数据大小即可重定义align 8,重新生成数据了。(前面的align 20h 也是同样的道理)
在这里插入图片描述
在这里插入图片描述

然后开始嵌入python脚本dump下数组内容

(这里积累第四个经验)
IDA库函数Dword是以当前地址向后四个作为Dword数据,所以我们地址要addr+4*i来保持4的间隔。(0x60213c-0x6020c0)>>2是因为地址之间以4为一个单位,>>2在前面博客中总结过就是除4且保留整数部分。

addr=0x6020c0
list1=[]
for i in range((0x60213c-0x6020c0)>>2):
    list1.append(Dword(addr+4*i))
print(list1)

在这里插入图片描述

逆向逻辑脚本:

key1=[36, 0, 5, 54, 101, 7, 39, 38, 45, 1, 3, 0, 13, 86, 1, 3, 101, 3, 45, 22, 2, 21, 3, 101, 0, 41, 68, 68, 1, 68, 43]
key2="L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A_{FL4G}_W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1t"
flag=""
for i in key1:
	flag+=key2[i]
print(flag)

在这里插入图片描述

.
.
总结:

1:
(这里积累第一个经验) 第一个红框中把用户命令行输入的a2赋值给了v3。 第二个红框用的是cout函数,输出Usage这个字符串。
第三个红框不明觉厉。 第四个红框allocator(&v13, a2, a3);应该是把a2的内容赋值给了v13。
第五个红框basic_string(v12, a2[1], &v13);应该是把v13赋值给了V12。
第六、七个红框应该是v11取v12字符串的开头begin(v12)。 第八、九个红框应该是v14取v12的结尾end(v12)。

2:
(这里积累第二个经验)
这里第一个红框sub_400D3D函数是取v11和v14比较,v14前面说过取输入字符串最后一个字符,而v11在第二个红框中sub_400D7A(v11)是向后取v11一个字符,所以这个if是判断当前字符是否为输入的最后一个字符,如果是就跳出循环。

3:
(这里积累第三个经验) 这里有个align 8,align num是让后面的字节都对齐num,也就是这里都对齐8才对,中间补7个0。可是这里下一个数和上一个数明明间隔4而已!后来查了很多资料才发现是IDA自动把多个0判断成对齐操作了,这里align 8是因为前面dd 24h中本来是db 24 0 0 0 然后后面一个双字是dd 0 也就是db 0 0 0 0,IDA把这连着的7个0当成了间隔,那上一个数和下一个数间隔就是8了,所以IDA生成了align 8。我们只要鼠标右键undefine或把上面的dd 24改一下数据大小即可重定义align 8,重新生成数据了。(前面的align 20h 也是同样的道理)

4:
(这里积累第四个经验)
IDA库函数Dword是以当前地址向后四个作为Dword数据,所以我们地址要addr+4*i来保持4的间隔。(0x60213c-0x6020c0)>>2是因为地址之间以4为一个单位,>>2在前面博客中总结过就是除4且保留整数部分。

解毕!敬礼!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐一 · 林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值