二进制,得益于学长的指导,自己在做的过程中少踩了很多坑。不过,我还是那个,pwn不出来,逆向不会做,密码又不懂,的懒狗。刚开学做课设,恰逢充足的时间、合适的水平,我来写这个系列,不会很无脑低级,也不会很高级,希望读者读有所获。那么关于更不更新得看女朋友心情,因为一般在深夜,希望你们喜欢。

"首先二进制手需要一个独一无二的订制版DA Pro作为自己的搭档档昂昂昂昂昂昂昂昂~"

“这不老生常谈么,又来卖基础坑我时间。”。”那~好叭,下面我来证明这件事情。“

开始,这是我电脑上的IDA pro。(滑稽脸)

其中IDA7.2没有怎么用过,主要用于完善ida7.0缺少的功能。

下面来介绍独一无二的IDA,桌面布局[参考《IDA pro权威指南》]:

没错,这个自定义的桌面布局比默认的好用多了,下面的notepad以及方便的IDAPython极大的提高了逆向分析效率,在windows标签下进行设置,更多设置请参考《IDA pro权威指南》。

哎?刚才说的的IDAPython是什么?好用么?

这个东西真的是超好用、没有它的二进制手是无法快乐滴、下面我来介绍这个花费我一年搞懂的装备----IDAPython。大部分同学可能打开IDA发现自己下面的Python(上图左下角)出现各种问题,比如插件报错等等(插件下文介绍),并且关于这个Python的环境往往还很懵逼,各种包从哪里来的不清楚。

当然,在介绍IDAPython之前,我还需要给读者讲点更基础的东西~,让我们一起来愉快的打开IDA的安装目录~放轻松,深呼吸。

哇~,是不是打开这个exe就可以快乐了,嗯对的,但在这件事之前,让我一个一个的为你介绍。

cfg:包含各种配置文件,其中基本IDA配置文件ida.cfg,GUI配置文件idagui.cfg以及

idc:包含IDA的内置脚本语言IDC所需的核心文件。

ids:IDA的符号文件,这些文件用于描述二进制文件引用共享库的内容。

loaders:我将这个成为加载器,用于加载PE及ELF等已知文件格式。

proc:包含IDA支持的处理器模块,用于根据不同CPU类型将二进制数据转为汇编语言~,如x86,MIPS,ARM。

sig:IDA模式匹配以及“快速库识别和鉴定技术”所需内容。

til:包含一些类型库信息,通过这些信息记录特定于各种编译器库的数据结构,当然这是可以定制的啦,详情参照《IDA pro权威指南》。

plugins:IDA所有插件便放置其中,是二进制手第二经常访问的文件夹~。

dbgsrv:用于远程调试的debug服务器,比方说你要在windows上debug一个安卓或者linux程序,就要用到它啦。那么详情是搜索百度,我这里就不费口舌了喔。

python:这个文件夹里便是IDAPython所需的库函数~

注:图中的python27是我安装进去的。IDAPython的配置各位同学参照百度啦。

好啦,读完这些有些累8,不要急,因为耐心是作为一位优秀同学的基本品质,下面我来讲重点、敲黑板。

IDAPython为什么会使人困惑呢,主要以下几点:

  • 装好的Python和本机上已有的Python环境变量冲突
  • 本机上有多个Python,导致连操作者不知道自己运行的哪个Python。

我的解决方法:卸载所有Python,安装Anaconda,每次使用前activate一条命令获得解脱~。IDA目录下的python27另外安装,仅供IDA使用。

耶~、这个在当时困了我好多天的问题,就是这么简单。

好的,看到这里说明你真的很适合学习逆向&PWN&密码、下面我来证明这件事情,希望你读有所获:

请读者打开这个easy_crack_me 链接:https://pan.baidu.com/s/1H1AiF7Dc-sIPvMm26qk0Rg
提取码:qice
,花5-10分钟看程序流程---------

-------......--------=======.......-------=======好的,10分钟过去啦,相信你没有打开它,更没有看程序流程,如果下面写的知识你没有看懂,我再次请你打开它,浏览程序流程。

这是位于地址0x400F00的一段4字节类型数据,让我们使用IDApython将它打印出来。

来吧跟我一起做,Shift+F2打开idc脚本编写界面,切换至IDAPython。

ads = 0x400F00
data = []
for i in range(0x10):
    data.append(get_dword(ads+i*4))
print data

哎,是不是很简单,这里还有很多IDA提供的API,建议分模块学习~。

下面我们再来试一下脚本自动下断点吧,在地址0x400747处下断点。让我们在左下角IDAPython键入add_bpt(0x400747),运行,喔???发生了什么?Function Not Implementation,没有实现的方法你放官方文档上干嘛?这我就很迷。

但转念一想,哎,最新版都到7.2了,让我试试7.2怎么样:

Python>add_bpt(0x400747)
True

喔,成功?nice,,可,,那我IDA7.0难道就凉了吗?不存在的,让我们打开IDA安装目录中的python目录,我把lib中的相关python文件给换了可不就行了么。随后我把7.0中..\python\lib\python2.7\lib-dynload\ida_32_ida_dbg.pyd替换成7.2对应目录下的,再运行,success。

hhh是不是很有趣,当然IDAPython使用正则表达式在反混淆和拷贝数据以及patch数据上占着主导作用,好好掌握就离二进制大佬不远了。

当然,以刚才的例子,拷贝出数据还有更方便的方法,就比如选中即可?是的

试着操作下,哎?你发现你的没有?没错,这是我装的插件,lazyIDA,安装方法百度/谷歌啦~^_^~下面还有很多好的插件,逆向同学的findcrypt、PWN同学的keypatch、好看的皮肤,方便的内置Python编辑器,列表如下:

好啦,知道你看到这里有点累唔,下面我来解决这个easy_crack_me吧:

1、复制出数据、解方程,get flag。

同学,我这里只能给你个脚本了,z3-solver,接着学。

import z3
flag = [z3.BitVec("f%d"%i, 32) for i in range(32)]

ans1 = []
ans2 = []
for i in range(8):
    t1 = 0
    t2 = 0
    for j in range(4):
        t1 += flag[4*i+j]
        t2 ^= flag[4*i+j]
    ans1.append(t1)
    ans2.append(t2)

ans3 = []
ans4 = []
for i in range(8):
    t1 = 0
    t2 = 0
    for j in range(4):
        t1 += flag[8*j+i]
        t2 ^= flag[8*j+i]
    ans3.append(t1)
    ans4.append(t2)

data1 = [0x0000015E, 0x000000DA, 0x0000012F, 0x00000131, 0x00000100, 0x00000131, 0x000000FB, 0x00000102]
data2 = [0x00000052, 0x0000000C, 0x00000001, 0x0000000F, 0x0000005C, 0x00000005, 0x00000053, 0x00000058]
data3 = [0x00000129, 0x00000103, 0x0000012B, 0x00000131, 0x00000135, 0x0000010B, 0x000000FF, 0x000000FF]
data4 = [0x00000001, 0x00000057, 0x00000007, 0x0000000D, 0x0000000D, 0x00000053, 0x00000051, 0x00000051]
s = z3.Solver()
for i in range(8):
    s.add(ans1[i]==data1[i])
    s.add(ans2[i]==data2[i])
    s.add(ans3[i]==data3[i])
    s.add(ans4[i]==data4[i])

vsum = 0
for i in range(16):
    vsum += flag[2*i]

s.add(vsum == 1160)
s.add(flag[31]==53)
s.add(flag[1]==102)
s.add(flag[5]==56)
s.add(flag[6]==55)
s.add(flag[17]==50)
s.add(flag[25]==52)

for i in range(32):
    s.add(flag[i]>0)

p = z3.Bool("p")
q = z3.Bool("q")
data5 = [0x00000080, 0x00000080, 0x000000FF, 0x00000080, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x00000080, 0x000000FF, 0x000000FF, 0x00000080, 0x00000080, 0x000000FF, 0x000000FF, 0x00000080, 0x000000FF, 0x000000FF, 0x00000080, 0x000000FF, 0x00000080, 0x00000080, 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF, 0x00000080, 0x000000FF, 0x000000FF, 0x000000FF, 0x00000080, 0x000000FF]
for i in range(32):
    if data5[i] == 0xFF:
        p = z3.And(flag[i]>=48, flag[i]<=57)
        s.add(p)
    else:
        q = z3.And(flag[i]>=97, flag[i]<=102)
        s.add(q)

ans6 = []
data6 = [0x00000003, 0x00000002, 0x00000002, 0x00000000, 0x00000003, 0x00000002, 0x00000001, 0x00000003, 0x00000003, 0x00000001, 0x00000001, 0x00000003, 0x00000001, 0x00000002, 0x00000002, 0x00000003]
pp = [z3.Bool("p%d"%i) for i in range(16)]
table = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 97, 98, 99, 100, 101, 102]
for i in range(16):
    tt = []
    for j in range(32):
        tt.append(z3.If(flag[j]==table[i], 1, 0))
    ans6.append(z3.Sum(tt))
    s.add(ans6[i]==data6[i])

if s.check() == z3.sat:
    m = s.model()
    ans = ""
    for i in range(32):
        t = m[flag[i]].as_long()
        ans += chr(t)
    print("NECTF{"+ans+"}")

参考资料:[IDA pro权威指南]: https://book.douban.com/subject/10463039/

好了,还会有第二篇滴。