一个被逼疯的web狗开始学逆向

  1. 简单分析
  2. Get Flag
    1. 静态分析
    2. ida动态调试
    3. gdb动态调试
    4. patch

被肺炎困在家里 无聊的一批 学一会逆向换换脑子

题目来源:攻防世界——getit

本篇主要是利用一道ctf题来学习一下常见的分析方法。为什么选这道题呢?

因为我太菜了只会这个题。。。。

简单分析

首先用exeinfope看看架构和壳

然后用ida64打开,打开后是这样的

大致瞥一眼,可以看到,程序逻辑是先计算出flag,然后把flag写进flag.txt,中间还会用u来对flag.txt的内容进行更改,而u的值为43个*

知道这些后 就可以着手查找flag了

做出题目的方法很多 下面将会列举出多种方法中的若干种

Get Flag

静态分析

最令人头秃的方式。。。。

上面这些就是计算flag的算法,s的值为c61b68366edeb7bdce3c6820314b7498

所以可以用python实现一下程序逻辑

s = "c61b68366edeb7bdce3c6820314b7498"
flag = "SharifCTF{????????????????????????????????}"
flag_changed = ""
v5 = 0
while v5 < len(s):
    flag = list(flag)
    if v5 & 1:
        v3 = 1
    else:
        v3 = -1
    flag[10 + v5] = hex(int(s[v5], 16) + v3)[2:]
    v5 += 1
for i in flag:
    flag_changed += i
print(flag_changed)

最终结果是SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

ida动态调试

逆向工程师防脱发必备技能之一,对新手贼友好

调试方法网上一堆 不再赘述

这里列出常用快捷键,方便以后查找

指令 功能
F7 单步步入 执行下一条指令
F8 单步步过 执行当前文件中的下一条指令
F4 运行到光标处
F2 下断点
F9 继续运行(运行到下一个断点后停下)
CTRL+F2 终止调试进程
CTRL+F7 一直在函数代码内部运行,直到遇到RETN或断点时停止

思路跟之前动态调试是一样的 不过不需要着重分析代码,一路f8,执行完while后就可以直接在t所在位置处看到flag

最终结果如图:

也可以通过一条语句来获取指定内存空间的值,如图

gdb动态调试

逆向工程师的必备防脱发技能之二,不过对汇编语言的功底要求较高,本菜鸡一脸懵逼

可以安peda来优化一下调试界面

思路还是跟ida动态调试一样,下断点,之后查看内存指定位置的值

地址已经在静态分析的时候看到了,这里直接操作就行

下断点

这里将断点下在while运行完的地方,就选fopen那,地址为0x4007EE

运行并查看内存指定位置的值

输入r可以运行到断点处

x/s [address]可以以字符形式查看指定位置的值

patch

入门不需要啥基础,一路nop就完事了

进阶的话还是需要汇编基础。。。

程序会在生成flag后将flag写入/tmp/flag.txt,但是每写入一个字符后紧接着就会给flag.txt中写入43个*,最后还会删掉flag.txt

那么我们删掉这些捣乱的代码是不是就直接可以cat /tmp/flag.txt拿到flag?

patch前的准备

可以安装一下keypatch这个插件 网上教程巨多,不再赘述

patch

首先需要找到对应函数对应的汇编代码,比如fseek(stream, 0LL, 0);对应的汇编代码如下:

将这块都用nop填充,即可删除这些代码

圈住想nop的汇编代码,用快捷键ctrl+alt+k调出keypatch的窗口,之后用nop填充

可以填充完之后再f5一下瞅瞅是不是成功了(虽然不一定保险,但这是我感觉最适合我这种菜鸡的方法了。。。)

确定无误后Edit -> Patch program -> Apply patches to input file进行保存

最后运行一下patch过的程序,看看flag.txt的内容,最终结果如下:


如果我的文章能帮到您的话我会很开心.如需转载记得注明出处:)
目录