今天开始学习CTF中的逆向
大致流程:判断程序是多少位以及是否加了壳,使用IDA进行反编译,在编写脚本
相关工具
【ExeinfoPe】
链接:https://pan.baidu.com/s/16SAvRVydckWYHF3wS93pGQ
提取码:gb3e
【Unpacker_ASPack】
链接:https://pan.baidu.com/s/1m73KxWa-HJgivuvOEb2JFg
提取码:wj33
【UPX Unpacker】
链接:https://pan.baidu.com/s/1QWivSIFFNJuhlwqm3AnZhQ
提取码:er4f
【IDA7.6】
链接:https://pan.baidu.com/s/1VXtb0CB0p11mDmTQlJWtRQ
提取码:we3d
easyre
1、下载题目中的压缩包,使用Exeinfo PE工具查看详细信息,发现没加壳
2、使用IDA64查看,找到main()函数,按F5反编译,直接就能看到flag
reserse_1
用IDA64打开,找到sub_1400118C0()函数,点击Str2,可以看到Str2是{hello_world},把o替换成0,那么flag为{hell0_w0rld}
reserse_2
打开IDA64,找到main()函数,F5反编译,s2就是输入的flag,由代码可知flag=s2,for循环中的flag由于之前没有定义过,说明它是由值得,双击flag就可以看到它的值,for循环里面的代码作用是用1替换i和r,所以flag为{hack1ng_fo1_fun}
内涵的软件
用IDA32打开,找到main()函数,F5反编译,点击main_0,直接能看到类似flag的字符串,提交试了一下直接成功了,flag{49d3c93df25caad81232130f3d2ebfad}
新年快乐
1、使用Exeinfo PE工具看到加了UPX1的壳,使用UPX Unpacker工具进行脱壳
2、用IDA32打开脱壳后的程序,找到main()函数,F5反编译,flag=Str2=HappyNewYear!
xor
1、用IDA64打开,找到main()函数,F5反编译
2、双击查看global(右键,点DATA),一共有32位
3、在根据逻辑写个脚本xor.c
#include<stdio.h>
int main()
{
int flag[33] = {0x66,0x0A,0x6B,0x0C,0x77,0x26,0x4F,0x2E,0x40,0x11,0x78,0x0D,0x5A,0x3B,0x55,0x11,0x70,0x19,0x46,0x1F,0x76,0x22,0x4D,0x23,0x44,0x0E,0x67,0x6,0x68,0x0F,0x47,0x32,0x4F};
int i;
for (i = 32; i > 0; --i )
{
flag[i] ^= flag[i - 1];
}
for(i = 0; i < 33; i++)
{
printf("%c",flag[i]);
}
return 0;
}
[ACTF新生赛2020]SoulLike
1、用IDA64打开,找到main()函数,F5反编译flag前10位为actf{actf{
2、这段代码是计算flag的11位到22位,且等于v8
3、查看一下sub_83A()函数,进行了一系列的运算,v8运算的最后结果就等于v3【每次运算得到的值,在进行下一位运算时会使用到】
4、编写脚本
#include<stdio.h>
#include<string.h>
int main()
{
char a1[13] = "", temp[13] = "";
char v3[] = {126,50,37,88,89,107,53,110,0,19,30,56};
int i,j;
for(i=0; i<12; i++)
{
for(j=0; j<255; j++)
{
strcpy(a1, temp);
a1[i] = j;
*a1 ^= 0x2Bu;
a1[1] ^= 0x6Cu;
a1[2] ^= 0x7Eu;
.....
a1[11] ^= 0x3Bu;
if(a1[i] == v3[i])
{
temp[i] = j;
break;
}
}
}
printf("flag{%s}", temp);
return 0;
}