对upx壳的一次较深入探究
最开始的起因是一个攻防世界的题目,这个题目使用的upx加壳,题目为easyre-150。
攻防世界题号会变化也就不给链接了,进阶区前三页内,还是比较好找。
如果直接upx脱壳的话,题目基本没有啥难度,但是在题目做完以后我去翻看这个原本加壳后的文件发现很有趣。
于是便去简单的了解了一下。
文章目录
easy-re-154
直接脱壳的方法
首先直接看到文件die查壳查到是upx_easyre150的壳,
然后直接脱壳,看到文件:
在动调的时候我们可以轻松改变,走向got key的位置,
然后会进入函数lol,
大概十个这样子,注意判定跳转前的两句:
.text:080486B0 mov [ebp+var_C], 0
.text:080486B7 cmp [ebp+var_C], 1
.text:080486BB jnz short loc_80486D3
这个其实永远不会进入到另一侧的语句运行,我们动调的时候改动下, 就可以看到flag,
当然,很坑的格式:要套上RCTF{},
就是一个很简单的题目,
下面我们去考虑下手动脱壳的方法?
知识点:
在此之前,我们先写一下这一部分出现的知识点:
proc文件
linux 下的proc文件体系实际上并不是文件,而是我们在运行中的进程,每个进程都会产生一个由其运行的pid为文件名的文件, 其中,/proc/[pid]/
目录下的文件:
-
cwd :
这是一个符号链接,指向这个进程的运行目录。
-
exe :
这也是个软链接, 指向这个进程对应的可执行文件。
-
fd :
这是一个目录,里面包含进程打开的文件的文件描述符,并且这些描述符都是软链接,指向实际文件。
-
maps:
这个文件包含当前进程在虚拟内存中的空间分布已经对应的地址,访问权限。
syscall
主要写一下里面出现的系统调用作用和调用号
32位 linux 程序系统调用
int 80
- sys_open:
eax=5
, 打开文件, 并返回一个该文件的文件描述符。 - sys_lseek:
eax=19
, 返回文件读写指针距离文件开头的字节大小。 - sys_unlink:
eax=10
, 删除文件链接的意思, 大体就是删除我们open的文件吧, - sys_ftruncate:
eax=93
, 将文件截断, - sys_execve:
eax=11
,加载和启动新的程序 - sys_munmap:
eax=91
, 映射内存
动调,手动处理壳:
那么就开始处理:
进入ida看到其实函数极少, 动调以后大致可以了解他们的内容, 这里简单进行了一下命名:
start函数:
这里就是函数入口处了,看起来没啥好看的,动调以后也会发现其实就没啥,进入main函数:
main:
main函数比较大,主要分成几个部分:
open ‘/proc/[pid]/exe’
首先是获取pid, 然后组成一个"/proc/[pid]/exe"
的一个字符串,打开这个文件,
我们上述提到过,这个地址对应是一个链接,指向这个程序自身的绝对地址,
简单点说就是打开自己这个程序本身。
同样我们也可以在
/proc/[pid]/fd/
中看到
open “AAAAAAAACDMVJO1A4NH”
后面的位置主要在两个循环中,处理了一个字符串:
将其处理为:“AAAAAAAACDMVJO1A4NH”
然后打开这个名字的文件,我们可以在/proc/[pid]/fd/
中看到: