题目下载:题目
查壳
无壳,32位程序,拖入IDA。
这道题之前看了看,主要操作是个switch语句,但是没有看太懂,然后我发现有用angr解这道题的,那时候还没接触,也没安装angr库,基本操作也不会,之前浅学了一下,还是不太精通,但是这道题是最基本的angr解法,所以用angr做一做。
进入主函数:
发现vm_operad是主要函数,而puts("good,The answer format is:flag {}");是你想要得到的,看它的反汇编记住地址,写脚本要用到。
进入vm_operad:
int __cdecl vm_operad(int *a1, int a2)
{
int result; // eax
char Str[200]; // [esp+13h] [ebp-E5h] BYREF
char v4; // [esp+DBh] [ebp-1Dh]
int v5; // [esp+DCh] [ebp-1Ch]
int v6; // [esp+E0h] [ebp-18h]
int v7; // [esp+E4h] [ebp-14h]
int v8; // [esp+E8h] [ebp-10h]
int v9; // [esp+ECh] [ebp-Ch]
v9 = 0;
v8 = 0;
v7 = 0;
v6 = 0;
v5 = 0;
while ( 1 )
{
result = v9;
if ( v9 >= a2 )
return result;
switch ( a1[v9] ) 主操作
{
case 1:
Str[v6 + 100] = v4;
++v9;
++v6;
++v8;
break;
case 2:
v4 = a1[v9 + 1] + Str[v8];
v9 += 2;
break;
case 3:
v4 = Str[v8] - LOBYTE(a1[v9 + 1]);
v9 += 2;
break;
case 4:
v4 = a1[v9 + 1] ^ Str[v8];
v9 += 2;
break;
case 5:
v4 = a1[v9 + 1] * Str[v8];
v9 += 2;
break;
case 6:
++v9;
break;
case 7:
if ( Str[v7 + 100] != a1[v9 + 1] ) //避免
{
printf("what a shame...");
exit(0);
}
++v7;
v9 += 2;
break;
case 8:
Str[v5] = v4;
++v9;
++v5;
break;
case 10:
read(Str); //读取输入str
++v9;
break;
case 11:
v4 = Str[v8] - 1;
++v9;
break;
case 12:
v4 = Str[v8] + 1;
++v9;
break;
default:
continue;
}
}
}
其中有read函数,是用户输入的,跟进
str长度15。
对于angr做法没有必要关注这些过程,我们只要知道我们想要得到puts("good,The answer format is:flag {}");并且不想得到 printf("what a shame..."),它的地址是
就可以了,然后用angr写脚本就好了。
import angr
p=angr.Project("./signal.exe") #加载文件
state=p.factory.entry_state() #创造状态state, entry_state构造一个从函数入口点执行的状态
sm=p.factory.simgr(state) #模拟管理器
good=0x4017A5 #想要的地址
sm.explore(find=good,avoid=0x4016ED)
if sm.found: #如果found分类不为空
find_state=sm.found[0] #found里的状态给find_state
print(find_state.posix.dumps(0)) #获取输入
在虚拟机中运行
得到了一个长度15的字符,正好就是flag。
angr初步学习参考angr 学习笔记__sky123_的博客-CSDN博客
linux下angr安装:ubuntu16.04安装angr 升级python3.7_Forgo7ten的博客-CSDN博客_angr python版本
基本概念
即初始参数用变量代替,模拟程序执行过程,维护执行到各个位置时的状态(用各个变量之间的代数关系表示)。
符号状态(Symbolic State)
当前状态所有参数的集合,用 σ σ σ 表示。集合中的每个元素用表示初始参数的变量表示。
路径约束(Path Constraint)
到达当前路径需要表示初始参数满足的关系,通常用 PC 表示。