攻防世界逆向高手题之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且保留整数部分。

解毕!敬礼!

攻防世界逆向高手题之re2-cpp-is-awesome相关推荐

  1. 攻防世界逆向高手题之reverse-for-the-holy-grail-350

    攻防世界逆向高手题之reverse-for-the-holy-grail-350 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的reverse-for-the-holy-grail-350 ...

  2. 攻防世界逆向高手题之dmd-50

    攻防世界逆向高手题之dmd-50 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的dmd-50 下载附件,照例扔入exeinfope中查看信息: 64位ELF文件,无壳,照例扔入IDA64位中 ...

  3. 攻防世界逆向高手题之re5-packed-movement

    攻防世界逆向高手题之re5-packed-movement 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的re5-packed-movement 下载附件,照例扔入exeinfope中查看信 ...

  4. 攻防世界逆向高手题之Guess-the-Number

    攻防世界逆向高手题之Guess-the-Number 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的Guess-the-Number 下载了一个jar文件,根据题目描述猜个数字然后找到fla ...

  5. 攻防世界逆向高手题的key

    攻防世界逆向高手题之key 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的key . . (这里积累第一个经验) 这道题,嗯~搞了好久,主要是我的IDA是7.5版本的,其他博客上的大多都是7 ...

  6. 攻防世界逆向高手题之EasyRE

    攻防世界逆向高手题之EasyRE 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的EasyRE 下载附件,照例扔入exeinfope中查看信息: 64位ELF文件,无壳,照例扔入IDA64中查 ...

  7. 攻防世界逆向高手题之handcrafted-pyc

    攻防世界逆向高手题之handcrafted-pyc 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的handcrafted-pyc . . 下载附件,照例扔入exeinfope中查看信息: . ...

  8. 攻防世界crypto高手题之best_rsa

    攻防世界crypto高手题之best_rsa 继续开启全栈梦想之逆向之旅~ 这题是攻防世界crypto高手题的best_rsa . . 下载题目,是一个明文和密钥的4个附件: . . 其实一开始我并不 ...

  9. 攻防世界crypto高手题之sherlock

    攻防世界crypto高手题之sherlock 继续开启全栈梦想之逆向之旅~ 这题是攻防世界crypto高手题的sherlock . . (这里积累第一个经验) 下载附件,是一个txt文档,内容是一篇小 ...

最新文章

  1. 展望2018:WebRTC大规模商用元年
  2. git在公司内部的使用实践(转)
  3. np.trapz 生动的解释
  4. python将二维数组转换为一维数组_python的set处理二维数组转一维数组的方法示例...
  5. Alpha预乘-混合与不混合[转]
  6. 使用docker commit 来扩展一个image
  7. ORACLE TEXT DATASTORE PREFERENCE(六)
  8. pdf转换成可在线浏览的电子杂志zmaker_pdf
  9. 2015年传智播客java_2015年Java 8强势开始
  10. Java描述设计模式(10):组合模式
  11. 字节缓冲流 BufferedOutputStream java
  12. Veeam黑科技之Direct NFS Access
  13. thinkphp 学习_4中URL模式
  14. mysql 登录的权限设置_MySQL 登录权限设置SQL语句
  15. shell 编程中的判断
  16. ASP.NET中缓存(cache)的控制方法
  17. 雷诺方程推导及FDM求解
  18. Datawhale 202210 Excel | 第五、六、七章 Excel函数示例 Excel函数列表
  19. python爬虫实践-腾讯视频弹幕分析
  20. 开启使用SPR Batch 问题记录

热门文章

  1. if语句判断真假的几种情况
  2. redis“万金油”的String,为什么不好用了?
  3. C++ 字符串、string、char *、char[]、const char*的转换和区别
  4. mitmproxy安装配合selenium使用教程
  5. 盘点SaaS在高歌猛进路上的16个坑,总有一个你会遇到
  6. UE4添加视频——手把手吧
  7. 用计算机弹123我爱你数字,数字谐音
  8. Android Studio实现外卖订餐系统
  9. JVM 上篇(12):垃圾回收相关概念
  10. 网民热议:顺丰菜鸟之争凸显大数据巨大商业价值