莫流云 发表于 2019-4-19 13:53

DDCTf2019re12

本帖最后由 莫流云 于 2019-4-19 14:08 编辑

首先我们用peid查看下发现加了壳,然后用工具脱壳即可然后载入ida分析F5查看main函数如下

发现先经过一个固定函数处理然后和DDCTF{reverseME}这串字符串比较双击进入上面的sub_401000函数

对密码表一一处理len(flag)=16,
用od打开,通过右键->中文搜索引擎->智能搜索 定位关键位置

双击输入正确后提示you got***向上查找在scanf处下断点

然后f9运行,再f8单步步过,然后输入,直到到flag处理而函数

F7单步步入,


然后写脚本就行了。查看0x402ff8处内存全为0
脚本如下
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<stdlib.h>
#include<string.h>
#include<string>
void drypto(int a[],char*b)
{    inti, j,k=0;   
charc = {};   
for(i = 0; i < 17; i++)   
   {         for(j = 0; j < 140; j++)         
    {             if(b == a)            
   {                  c= char(j);            
}         
}   
}      
printf("%s", c);}
int _tmain(int argc,_TCHAR* argv[])
{    inta = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xB7, 0x10,0x1F, 0xB6, 0x48, 0xEF, 0xE0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFE, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x7E, 0x7D, 0x7C, 0x7B, 0x7A,0x79, 0x78, 0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70, 0x6F, 0x6E, 0x6D,0x6C, 0x6B, 0x6A, 0x69, 0x68, 0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,0x5F, 0x5E, 0x5D, 0x5C, 0x5B, 0x5A, 0x59, 0x58, 0x57, 0x56, 0x55, 0x54, 0x53,0x52, 0x51, 0x50, 0x4F, 0x4E, 0x4D, 0x4C, 0x4B, 0x4A, 0x49, 0x48, 0x47, 0x46,0x45, 0x44, 0x43, 0x42, 0x41, 0x40, 0x3F, 0x3E, 0x3D, 0x3C, 0x3B, 0x3A, 0x39, 0x38,0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2F, 0x2E, 0x2D, 0x2C, 0x2B,0x2A, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x00, 0x01,0x00, 0x00, 0x00, 0x88, 0x2E, 0x3B, 0x00, 0x58, 0x3C, 0x3B };   
charb = "DDCTF{reverseME}";   
drypto(a,b);   
return0;}
re2Re2是re1的加强版首先还是先peid查壳然后脱壳,接下来ida打开分析,首先还是查看main函数,然后f5

双击到sub_1181240函数里面查看,

双击到sub_1181000函数里面查看

然后od动态调

步入关键函数看到

下面代码为吧咱们的输入两位两位组合在一起

继续向下看,

下面一关键函数我转换成了伪代码形势
(输入为ABCDEF时)
for(i=0;i<strlen(s)i+=3)
input code:x1=s>>0x2      ab>>2==2A            esp=0x18x2=s&0x3         
ab&0x3=0x3x3=s<<0x4      0x3<<4=0x30x4=s>>0x4      
CD>>0x4=0cx5=x4+x3            0x30+0xC=0x3C         esp=0x19x6=s&0xF         
CD&0xF=0xDx7=x6*2             0xD*2=1Ax8=x7*2             1A*2=0x34x9=s<<6         
EF<<0x6=0x3x11=x9+x8         0x34+0x3=0x37         esp=0x1Ax12=s&0xF      EF&0xF=0x2F             esp+0x1B
需要用到的x1x5    x11   x12需要用到的再和作为下标从密码表中取值再和0x76异或得到字串和flag判断是否正确,在根据字串手动逆回去就得到正确flag了

莫流云 发表于 2019-5-3 17:43

625641201 发表于 2019-4-19 15:17
这道题我在OD的寄存器中的EAX可以查看到ascll答案的,还要写一个脚本花费了多一些时间

受教了看来我技术不到家

hahahunqiu 发表于 2019-4-19 14:17

做了沙发虽然看不懂大神,还是感谢分享!

625641201 发表于 2019-4-19 15:17

这道题我在OD的寄存器中的EAX可以查看到ascll答案的,还要写一个脚本花费了多一些时间

gxkyrftx 发表于 2019-4-19 16:57

大佬用的啥工具脱的壳啊?

yaoyao7 发表于 2019-4-19 18:03

为什么你们的虚拟机都是server?

gyzzzzz 发表于 2019-4-20 18:36

能脱掉壳么,我看od能做出来,但是脱不掉壳

freemoredoom1 发表于 2019-4-20 20:07

iret_52 发表于 2019-4-21 01:15

看实例很有帮助!

chenjin056 发表于 2019-4-25 22:14

谢谢分享希望论坛越办越好
页: [1] 2
查看完整版本: DDCTf2019re12