欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单逆向题 实验吧之reversemeplz writeup

程序员文章站 2022-05-15 10:21:17
...

简单逆向题 实验吧之reversemeplz writeup

这道题目的链接: http://ctf5.shiyanbar.com/re/challenge 这是题目的下载地址

先用file命令看下文件的属性

简单逆向题 实验吧之reversemeplz writeup

这个程序是32位的,这样就可以拖进ida32位了


然后先f5一波

简单逆向题 实验吧之reversemeplz writeup

由此可知我们需要输入的数存在了s中,接着执行了sub_8048801这个函数

我们进入这个函数

简单逆向题 实验吧之reversemeplz writeup

这里又有一个函数sub_8048519

我们再点进去看下

简单逆向题 实验吧之reversemeplz writeup

简单逆向题 实验吧之reversemeplz writeup

这么长的一个函数。。。一般情况下不会让我们分析的吧,毕竟这只是个简单的题目,那我们就用动态分析的方法看一看

用ida远程调试一下

简单逆向题 实验吧之reversemeplz writeup

这个是调试的界面,我把断点下在了主函数的call位置进入call的函数

简单逆向题 实验吧之reversemeplz writeup

看见j = 15 那我们就输入十五个字母试试先试试abcdefghigklmn

简单逆向题 实验吧之reversemeplz writeup

然后我们继续运行下程序

先解释下,在第一个循环当中其实最主要的就是对v9 进行一个赋值然后进到下一个函数,为了让其return 1 我们就要让其满足最后一个return条件

sub_8048519 == 98

现在程序大概的思路清晰了,我们来解决sub_8048519这个函数到底是干什么的问题

查看v9 中的值和我们的输入进行对比

简单逆向题 实验吧之reversemeplz writeup

这和我们的输入一进行对比我们就能发现一一对应的关系,当然这过程当中我也试过所有可打印的ASCii码值最后发现了这个规律,读者可以尝试下,毕竟这比一字一句的去看那个长到爆炸的函数好,当然那句

 if ( (unsigned __int8)v3 > 204u && v3 != 207 )
      v1 = 1;

可以发现这个v3转换是有范围的不然是进入不到下一个函数的,这个ida原来打开应该是-49 因为这个v3是个char类型所以有溢出

接下来我们既发现了 a —m 对应的是 n—z

那么这个函数就解决了

接下来进入下一个循环的

if ( (unsigned __int8)*(&v9 + v4) - (unsigned __int8)*(&v8 + v4) != *(&v11 + v4) break;

可以发现这句话是一个关键因为为了保证我们的循环能够顺利运行到我们要的return 1 的位置那么我们就需要是if 语句中的一只为 0 

那么我们再动态调试一波,看一下v8 的地址刚好就在v9 上面一个也就是说是

v9[I] - v9[I - 1] = v11[I]

那么v11 又是什么尼 我们来看下汇编

简单逆向题 实验吧之reversemeplz writeup

这个ebp +eax*4-4ch 也就是在这个地址的数每4位取一个值作为v11 还要考虑到v11为int8 范围是-128~127

简单逆向题 实验吧之reversemeplz writeup

第一个数为FFh 因为int 为8位 所以 FF应为-1 二下面第四个是11h为17 依次类推,我这里还没有截取完全读者可以自己去截取下

接着v11数就出来了,而且我们知道了第一个数就是 ‘o’因为最后一个判断条件

接下来贴上代码

# /usr/bin/python3.6
# -*-coding:utf-8-*-

__Author__= 'Gtozju'

v11 = [-1, 17, -11,  3, -8, 5, 14, -3, 1, 6, -11, 6, -8, -10]


map = {'n':'a', 'o':'b', 'p':'c', 'q':'d', 'r':'e', 's':'f', 't':'g', 'u':'h', 'v':'i', 'w':'j', 'x':'k', 'y':'l', 'z':'m', 'a':'n', 'b':'o', 'c':'p', 'd':'q', 'e':'r', 'f':'s', 'g':'t', 'h':'u', 'i':'v', 'j':'w', 'k':'x', 'l':'y', 'm':'z'}

key = ord('b')
flag = 'o'
for i in range(14):
    key += v11[i]
    flag += map[chr(key)]

print('flag{' + flag + '}')
这道题目就解决啦,总结下动态调试找规律是这个题目的简单方法,当然也有复杂一些一步步逆出来