回顾:
标题描述好像是脱壳相关的逆向工程题目。
根据给出的地址下载
文件
它是一个可执行文件
执行
emm什么都看不到,而且没有源码
然后加载gdb
Emmm,没有符号表,无法反汇编
哦,对了,根据标题,这是一个 shell,所以先脱壳
这是什么壳?
看一看
韓輯
这里对upx做一下简单的介绍:
UPX 是一个著名的压缩壳,主要作用是压缩 PE 文件(如 exe、dll 等文件),有时可能会被病毒利用来避杀。upx shell 是一个保护程序,一般是针对 EXE 文件的外部保护措施,主要用途有:
1.保护常规文件,使其难以被修改和破解。
2. 压缩文件使其更小。
3、保护防病毒软件安装程序不受到病毒的攻击。
4. 木马病毒的保护壳让病毒难以突破
相对于很多shell来说,upx的手动脱壳比较简单,不过本文主要侧重学习pwn而非脱壳,如果对upx的手动脱壳感兴趣的话,这里有一篇文章推荐:
我们可以在这里自动解压。
接下来,加载 gdb
拆开main之后,看到一个地址
打印出来
这是旗帜
装箱与拆箱技术:
复制上面的链接进行实验。
根据问题描述,编译时没有错误,那么会报错吗?
连上机器之后先看下源码
从源代码中我们可以看到
1.程序功能是先输入name,再回车,相当于输入一个用户名和两个密码
2. main中,login依次执行,中间没有push和pop,且两者的ebp相同
3. scanf 在 login() 中接收输入时,没有加 & 来获取地址。由于 未初始化,当我们用 scanf 输入数据时,并不知道数据保存在何处。我们只知道数据保存在 的值指向的地址中。
考虑到2和3,我们想知道我们是否可以控制name的内容。毕竟name占了100个字节,并且三者的ebp是相同的。
但是这可行吗?让我们在 gdb 上尝试一下
图十
可以看出name的地址是%ebp-0x70exe脱壳,.name的地址是ebp-0x10,两者相差0x70-0x10=96字节,.name的地址是%ebp-0xc,.name和from相差0x70-0xc=100字节,我们只能通过写name来控制,而不能控制
既然它可以被控制,这个想法就变得清晰了。
从源代码逻辑中我们可以看出,scanf,
我们控制的地址(name的最后4个字节)就是地址,后面scanf("%d",)接收输入的时候,就输入这个地址(“/bin/cat标志”
这样执行的时候就会执行,这样就可以读取flag了
通过GOT表获取flush地址
在图x中我们可以看到调用的地址是,但是在这之前还有一个参数传递操作,所以其实地址应该是,十进制
从而构建 exp
总结一下,这里用到的技术叫GOT覆盖,对于这道题来说,是这样的:
我们控制了 nane 的后四个字节,将 的值改为 的地址。程序中,后面会调用 scanf,而我们已将(“bin/cat flag”)的地址写入 ,覆盖了 GOT 表中的内容。因此,在调用 scanf 时,会直接执行打印 flag 的操作,绕过后面的比较逻辑。
根据描述,和随机数有关。
从源码中我们可以看到,只有当key和XOR满足的时候,才会打印flag。
key的值由rand函数生成,key的值由我们输入
所以这个问题的关键是找到什么值
我们知道rand函数其实生成的是伪随机数,所以我们可以写一个程序,先从rand生成一个数,然后与进行异或,得到的值就是我们输入的密钥
这是一种思维方式
或者我们也可以使用gdb调试,在程序判断if条件是否为真的地方设置断点,观察内存布局,同时还可以得到值
设置断点后,输入 2 并点击
如你所见,2 是我们的输入,并且
然后我们将这个值与输入的密钥进行异或
看标题,这道题是跟arm和有关的。
下载源代码并查看
可以看到,在main函数中必须满足key1()+key2()+key3()=key才可以打印出flag。
关键是我们需要输入
key1()等所代表的相关函数的返回值。
所以这道题就是找到相关函数的返回值并添加
C源代码中的三个函数采用内联汇编的形式。
或者直接用 gdb 来查看
标题告诉我们这是 arm
通常情况下,ARM 将返回值存储在寄存器 r0 中,该寄存器对应 x86 中的 eax。
这也可以从汇编中看出
那么每个函数中r0的值是多少?
逐一查看
先看key1
可以看到,pc->r3->r0,也就是说r0的值就是pc寄存器的值
这里有一个知识点
ARM是RISC,具有简化的指令和三级流水线:取指令、解码和执行。
当执行mov r3,pc时,pc为当前指令地址+0x8,并且+0x8
看看key2
add r6,pc,#1 表示r6=pc+1,由key1可知r6=+8+1,并且该值的最低位为1。
为什么要强调最低位?
因为下一条指令 bx r6
bx指令用于切换处理器状态模式,当最低位为1时,切换到Thumb指令执行,为0时,解释为ARM指令执行。
因此执行此命令后,它会切换到拇指模式
在thumb模式下,pc值为当前指令地址+4
所以当执行r3,pc时,r3的值为+4
然后执行adds,r3,#4和r3+4+4的值
执行mov r0,r3后,r0的值与r3相同
让我们看看 key3
执行完红框两条指令后,r0的值等于lr的值
lr是r14,存储函数返回地址
具体的值可以在main中看到。
总结一下,关键价值在于
后续资讯请关注每日文章推送!
声明:作者本意是为了分享和普及网络知识,若读者因此采取任何危害网络安全的行动,后果自负,与和天智汇及原作者无关!
标题:exe脱壳 合天智汇前情提要:0x04flag 脱壳相关逆向题目解析
链接:https://yqqlyw.com/news/xydt/7352.html
版权:文章转载自网络,如有侵权,请联系删除!