2.1.1 reverse 1(re)
64bit可执行文件,无壳
打开ida64,快捷键Shift+F12,可以打开string窗口,一键找出所有的字符串,右击setup,还能对窗口的属性进行设置
找到一个类似于Flag的字符串。
双击,查看字符串在程序哪个位置被调用了
双击跳转到该值地址处,发现有被sub_1400118C0引用
sub_ 指令和子函数起点
F5查看伪代码
分析伪代码
strncmp函数为字符串比较函数
strncmp(string1,string2,count)
string1给定的字符串,string2给定的字符串,count要进行比较的长度
如果string1和string2的前count个字节完全相等,则返回为0
sub_1400111D1("input the flag:"); sub_14001128F("%20s", &Str1); v3 = j_strlen(Str2); if ( !strncmp(&Str1, Str2, v3) ) sub_1400111D1("this is the right flag!\n"); else sub_1400111D1("wrong flag\n"); |
v3是str2的长度,说明当str1完全等于str2时,输入为0。!strncmp(&Str1, Str2, v3):说明完全相等时输入为1,当str1=str2时,就是flag。
双击查看str2的值
得到flag就是{hello_world},提交发现错误,想想前面的步骤,只能从伪代码入手。
for ( (&v6 + 1) = 0; ; ++(&v6 + 1) ) { v8 = (&v6 + 1); v2 = j_strlen(Str2); if ( v8 > v2 ) break; if ( Str2[(signed __int64)(&v6 + 1)] == 111 ) Str2[(signed __int64)(&v6 + 1)] = 48; } |
ESC退出,再F5查看伪代码,注意这段对str2进行的代码
&v6 + 1 相当于一个变量,把&v6 + 1 的值赋到 v8,当v8大于v2时,终止
如果str2中间这个东西等于111(参照ASCII码表111表示字符o)
就把48(48表示字符0)赋值给str2中间这个东西;
想到错误的flag{hello_world},o换成0,得到flag{hell0_w0lrd}
2.1.2 reverse2(re)
查壳,发现是64bit文件。先直接拖入ida64。
Shift+F12查看string,
双击打开this is the right flag!
右键,input the flag—jump to operand
发现重要的东西
将78h长按R转换ASCII。转换成{
发现flag{hacking_for_fun}
提交发现错误,F5看看伪代码,
主要代码,转换一下ascii
这句话意思是,把i和r转换成1
得到flag{hack1ng_fo1_fun}
2.1.3内涵的软件(re)
照常查壳,32bit文件
拖入ida32,查看main函数
发现这里面还有一个main函数,双击打开后就是如下代码
程序员粗心忘记把变量写进来了,这里面就v3的值长得像flag试试提交下,发现正确。