re1
game
Hello, CTF
simple-unpack
no-strings-attached
@TOC
re1
题目描述:菜鸡开始学习逆向工程,首先是最简单的题目
思路
拖入ida,转伪代码
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
点开xmmword_413E34后发现是一串数字,R转成字符发现是
还是因为小端存储问题,db占一字节,正好是字符,所以只要倒过来就行了
或者还可以快捷键A直接转成
还可以找到相应地址后在16进制视图中快捷键G找到正确顺序的flag
game
题目描述:菜鸡最近迷上了玩游戏,但它总是赢不了,你可以帮他获胜吗
思路
附件是一个应用程序exe
这个题可以根据提示做对游戏得到flag(然额我就没点开,无脑拖入ida)
结果main函数有好几个,一开始点进了没flag的main函数里一直跳转,心态炸裂。找到main_0()
1 | void main_0() |
发现 done!!! the flag is ,定义了好多个字符最后有一个
1 | for ( i = 0; i < 56; ++i ) |
那么for循环之后应该就是flag
然后我一开始懒省事复制粘贴
1 | #include<iostream> |
结果运行出来全是乱码,后来想想发现可能是*(&v2 + i)的问题,由于v2,v3等等是分别定义的而非定义为一个数组,所以v2,v3地址可能不是连续的。最后造成乱码(不确定)
但这样的话,定义成数组数字难到一个一个输吗?或者写个别的程序得到数字?
后来看题解找到有人说地址是递减的,要把for循环里的(地址+i)都改成(地址-i)但是这样解出来还是乱码,不知道为什么。。
从题解中找到的第二种方法
直接patch改程序(原来ida有这种操作),
1.把得到flag的条件改为灯全灭,在exe中随便打开一个灯再关掉就得到了flag
把jnz改为jz
jnz结果不为零(或不相等)则转移。
jz即零标志为1就跳转
2.或者在前面某个地方直接加一个call sub_45A7BE,运行程序得到flag(感觉自己可以破解游戏了hhh)
3.好像还加一个 (jmp xxx地址) 也可以,但后面的地址不能用45A7BE,好像得用od找,目前还不会。
Hello, CTF
题目描述:菜鸡发现Flag似乎并不一定是明文比较的
思路
转伪代码
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
综上,只要自己输入的字符与v13相等,就是flag,将v13转为字符串,得到flag
学题解上的脚本
1 | #!/usr/bin/env python3 |
还可以在16进制视图里直接输入437261636b4d654a757374466f7246756e,得到flag
simple-unpack
题目描述:菜鸡拿到了一个被加壳的二进制文件
思路
之前虽然知道做题前要先查壳,但一直没用到过,前面的题也不需要查壳脱壳。这道题算是初步了解了查壳脱壳。
壳:负责保护软件不被非法修改或反编译的程序。分为压缩壳和加密壳。
查壳的方法:
1.windows:用exeinfope,将文件拖入查壳。(peid好像是没人维护数据库了,所以查不出来)
2.kali虚拟机中
file 文件名
checksec 文件名
也可以
脱壳方法:
看脱壳信息中或packer中 是upx壳,一种压缩壳。
可以从脱壳信息中的upx官网中下载upx(不同的壳好像需要不同的软件)
脱壳后拖入ida64,
进入main函数直接找到flag
no-strings-attached
题目描述:菜鸡听说有的程序运行就能拿Flag?
思路
从这个题了解了动态调试gdb的基础用法
b 设断点
r 运行
n 单步步过
1.查壳
32位程序,无壳,不可执行
2.拖入ida,找main函数生成伪代码
从下往上点进去函数
先进去authenticate()
stdin,输入字符串,
下面还有printf,打印,
点进去printf里面的东西,if里面的出现的是success,else里面是access denied,所以说明只要满足if,ws==s2,就success了,ws是自己输入的,所以s2即为flag
进入decrypt
3.两种方法
(1)模拟decrypt,
从题解中找到了之前的疑惑,ida中可以直接写python脚本,导出数据,不用一个一个打字
addr为起始的地址,range可以用(结束地址-起始地址)/想要得到数据类型的字节数(Dword是4字节,后面的addr每次加4) 来计算
函数 .append(xxx)是在末尾加上xxx
运行之后在输出窗口中显示。
找到dword_8048A90和s
1 | #!/usr/bin/env python3 |
这个是看题解后写的
其实一开始就想用分析程序模拟做的,但进入decrypt之后找不到v4的值,所以没法写,不知道题解中怎么知道v4就等于0的
(2)gdb动态调试
因为文件时32位linux程序
将文件拖入kali虚拟机中
使用gdb
设断点 b decrypt
运行到decrypt,单步步过,光标在s2处看到下面的地址为8048725
在ida中找到该地址,发现调用decrypt后,把eax赋值给ebp+s2,说明eax存储了decrypt的返回值
x表示查看寄存器内容,s是字符串表示,w是四字节(题解中也有用x/200wx $eax的,但之后还要16进制转字符串)
-------------本文结束感谢您的阅读-------------