Windows_Reverse1 攻防世界

工具

OD+DIE+IDA+UPX脱壳机

思路展开

1.查壳,脱壳

1
UPX的壳,手动脱壳或者脱壳机脱壳,但发现脱完壳的程序在win7下打不开,即使是显示没壳(这里后来查到win7包括以上版本开启了ASLR(地址随机化),winxp就没有,如果程序采用绝对地址,在win7和win10上就运行不了),直接IDA启动,IDA里不爆红就没事。

2.IDA启动

IDA(32-bit)载入,整体逻辑结构简单,数组赋值,在三个收获里讲一些细节。
2
三个收获

1.关键函数sub_401000,关键函数的参数是v6,而后面的关键比较是比较v4。v6和v4如何建立关系,

v6点进去-00000404 var_404 db ?
v4点进去-00000804 var_804 db ?
再看汇编3
v6和v4都被送入程序,再点击sub_401000。
汇编第一句就是将ecx压入UPX0:00401000 push ecx
接着看sub_401000的反汇编(下图),*v1就是ecx,这样v6和v4联系在一起。4

2.接着往下看,v4是地址的差值,竟然作为数组下标,v1[v4]这个操作,我们拿笔和本,写一下就会发现,它是在遍历a1(就是我们的输入),这是一种遍历数组的新方法,特此记录。
3.*v1 = byte_402FF8[(char)v1[v4]]; byte_402FF8数组点进去无法看到全部内容,下面有一堆数,但也无法直接确定。OD启动

5
红框内位置,反复修改eax的值,观察d1的值,在结合刚才看到的一串数,就可以快速确定全部数的位置。

3.脚本

hexData=[
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xAE, 0x1D, 0x3E, 0x07, 0x51, 0xE2, 0xC1,
    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, 0x90, 0x19, 0x9F, 0x00, 0xA8, 0x2C, 0x9F ]
str='DDCTF{reverseME}'
flag=''
for i in range(len(str)):
  flag+=chr(hexData[ord(str[i])])
print('flag{'+flag+'}')

flag{ZZ[JX#,9(9,+9QY!}

发布了42 篇原创文章 · 获赞 17 · 访问量 4990

猜你喜欢

转载自blog.csdn.net/weixin_45055269/article/details/105494922