buuctf做题记录
查壳
32位无壳
IDA分析
反编译start函数
逻辑很清晰,先获取输入的字符串,然后进行加密,最后与密文进行比较。
查看加密函数:
逻辑也很清晰,输入从末端到首段,尾部与v4异或,其余与后一位的字符异或。
看看V4是什么:
没看懂,所以选择了OD进行动调,找到xor异或的那条命令,查看相应寄存器,得到v4=0x4。
分析过程结束,可以写脚本了。
#include<iostream>
using namespace std;
int main()
{
int a[] = {0x0D,0x26,0x49,0x45,0x2A ,0x17 ,0x78 ,0x44 ,0x2B ,0x6C ,0x5D ,0x5E ,0x45 ,0x12 ,0x2F ,0x17,0x2B ,0x44 ,0x6F ,0x6E ,0x56 ,0x09 ,0x5F ,0x45 ,0x47 ,0x73 ,0x26 ,0x0A ,0x0D ,0x13 ,0x17 ,0x48 ,0x42 ,0x01 ,0x40 ,0x4D ,0x0C ,0x02 ,0x69 ,0x00};
int v4 = 0x4;
int i;
int n = 0x27-1;
a[n]=a[n]^v4;
for(i=0;i<0x27;i++)
{
a[n-i-1] = a[n-i-1]^a[n-i];
}
for(i=0;i<0x27;i++)cout << (char)a[i];
}
得到flagR_y0u_H0t_3n0ugH_t0_1gn1t3@flare-on.com
包上flag{}提交即可。
小记
ROL(循环左移)指令把所有位都向左移。最高位复制到进位标志位和最低位。
汇编语言指令 ROL
循环左移指令:ROL DEST,COUNT
指令功能:把目的地址中的数据循环左移COUNT次,每次从最高位(最左)移出的数据位都补充到最低位(最右),最后从最高位(最左)移出的数据位保存到CF标志位。
标志位影响:CF标志用于保存最后从最高位移出的数据位。如果COUNT=1,OF标志有意义,如果移位前后数据的符号位发生了变化,OF=1;如果符号位没有发生变化,OF=0。如果COUNT>1,OF标志不确定(没有意义)。
ROL4的汇编就是左移4位。