【CTF】2023铁人三项赛第一赛区 初赛 逆向方向WP

· 2023-01-10 · 1657 人浏览

Reverse

HelloWorld

看图片注释写的很明白,直接分析程序逻辑就行,

题目先生成了个随机数,然后给了个字母表,题目要求输出HelloWorld,观察到最后cout是输出这个output的内容,output也是程序开始random随机出来的内容

观察到程序对output进行了修改,分析可以分析出来每轮循环读入2字节的数据,提取第一个字节的高4bit和低4bit,这里直接方便看改成了hibyte和lowbyte(自己能理解是什么就行)

高位作为下面进入各个分支的条件,低位作为控制output的下标。

每轮的第二个字节只在赋值区域被用到,作为字符表的索引。

image-20230110214515429

构造输入即可

print('0'+chr(7)+'1'+chr(4)+'2'+chr(11)+'3'+chr(11)+'4'+chr(14)+'5'+chr(22)+'6'+chr(14)+'7'+chr(17)+'8'+chr(11)+'9'+chr(3)+chr(0x10)+chr(1)+chr(0x15)+chr(1)+chr(0x4A)+chr(1))

#'0'字符为0x30,高4bit为3进入了赋值的if分支,低bit作为控制output的idx
#前有v9=&11[1]&31,31即0b11111,v9仅作为赋值分支中v27也就是控制字母表的idx使用
#因此第一组0x30 0x7意思是进入赋值分支,控制输出的第0位,赋值为字母表中idx为7的字母
#后面以此类推
#0x10 0x1 0x15 0x1的意思是把第0位和第5位的字母变大写
#0x4A 0x1的意思是进入4分支 也就是00截断,在0xA的位置写入一个0x0 截断输出

#最后利用管道符把python的输出直接输出到远程上
#python ./re2.py | nc 172.31.0.157 50000

rand5

可以看出来是五次换表,伪随机生成的表,动调把五张表拿出来

image-20230110214555029

直接用cyberchef解就行

image-20230110214615621

Theme Jasmine by Kent Liao