首页
社区
课程
招聘
使用
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2023-7-27 14:52
0
[原创] UPX源码学习和简单修改
bxc 测试发现给linux可执行文件加壳可以正常工作, 但给so动态库加壳不行, 看源码, 好像还需要修改amd64-linux.elf-so_main.c这个文件来实现so的解密才行.32位ARM好像是需 ...
是的,因为so库和可执行文件的布局有差异,处理文件不一样,我这里只尝试了可执行文件的加壳修改
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2023-7-7 09:25
0
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2023-5-21 17:25
0
[原创] UPX源码学习和简单修改
wx_pf 大佬请教下,对于修改压缩数据那里修改第4个文件的时候,我的CPU架构不是amd64,是armv7l,所以不能修改amd64-linux.elf-main.c。然后我通过调试upx-3.96的源码发现实 ...
你可以看下upx3.96/src/stub目录下的Makefile文件,或者在upx3.96/src目录下执行make all,根据命令行输出查看是那个文件生成的arm_v5a_linux_elf_fold.h
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2023-2-10 09:04
0
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2023-2-9 16:58
0
[原创] UPX源码学习和简单修改

用vmtest师傅提到的工具就可以,根据说明配置好之后,编译的时候类似amd64-linux.elf-fold.h的.h文件都会重新生成的。

最后于 2023-2-9 17:01 被luoye_ATL编辑 ,原因:
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2023-2-6 14:07
0
[原创] UPX源码学习和简单修改
dayang WIN下的,也是一样的么?

WIN的加壳流程我不太清楚,得你自己阅读源码了。loader部分的话使用的是另外的文件,在目录upx-3.96/src/stub/src/可以看到

最后于 2023-2-6 14:29 被luoye_ATL编辑 ,原因:
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2023-2-1 22:27
0
[原创] UPX源码学习和简单修改
vmtest https://github.com/upx/upx-stubtools upx的loader是通过这个工具生成的 (也就是你上面修改的 amd64-linux.elf-fold.h )
是的,我后来就是用这个工具重新编译修改后的代码生成 amd64-linux.elf-fold.h 文件
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2023-1-7 17:44
0
[原创] UPX源码学习和简单修改
wyfe 不错的帖子,二次开发,加点VM进去?
VM得下下个阶段了,下一步想着想研究下解压的汇编代码
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2022-8-22 17:27
0
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2022-8-3 13:56
0
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2022-7-5 17:19
0
雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2022-5-13 11:50
0
[求助](已解决)关于angr去除虚假控制流混淆中遇到的死循环问题
天水姜伯约 //Ver1, 可以去掉bogus if (x * (x + 1) % 2 == 0) { bogus(); } //Ver2, 应该不可以去掉bogus,因为angr会在第一个循环进入路 ...

我今天按照你说的第二种代码编了个程序试了下,用原来的代码确实不行,在 

proj.factory.simgr(state)

中加入 veritesting=True 参数也不行。

感觉这种情况应该需要人工干预去处理了。


尝试:

我的源码反汇编之后是

因为这里符号执行是为了找到执行过的块,考虑到后面的if条件永假,所以我这边做了个简单处理:循环执行一次就剪该链路。

处理后的执行代码如下:

while len(simgr.active) > 0:
    for active in simgr.active:
        if active.addr not in blocks and active.addr == 0x4007a2: # 指定该块,执行过后就剪掉
            simgr.active.remove(active)
        blocks.discard(active.addr)
        # hook call instructions
        ......

    simgr.step()

最后的结果反汇编如下

可以看到是去除了。


思考:

我这种处理方法是特例,因为变量 i 对后续代码的影响有限。

要是后续有使用 i 且产生分支,我觉得有两种处理方法,都是人工干预

1、在剪掉这个路径后,在下一个代码块开始时,手动对循环中变化的变量(本例中为 i )进行符号化赋值,或者直接跳过这个循环,然后符号化赋值。

2、针对本例 for 循环这种单输入输入的代码块,进入前切换到模拟执行(使用类似unicorn工具),该块代码执行完后,切换到符号执行模式,同步变量。思路类似于symbion,也就是帖子 http://www.hackdig.com/09/hack-467817.htm 提到的第四种方法。

感觉第一种方法容易实现些。第二种方法工作量比较大,不知道业内有没有成熟的方法。


当然,这只是我的个人看法,如果有什么不对的地方,希望大佬指针,也希望论坛的朋友们提出建议。

雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2022-5-12 18:05
0
[求助](已解决)关于angr去除虚假控制流混淆中遇到的死循环问题

经过多次尝试,我发现了问题原因。主要是去混淆的这个函数存在char*入参,而我在初始化的时候没有提供该参数的信息,导致angr将其当为默认符号化参数,长度会一直增加,在第一个循环中出不来,就导致了死循环。

解决方法也很简单,使用gdb调试下,查看参数通过哪个寄存器传递,然后使用blank_state获得开始的状态后,对指定寄存器进行初始化。

经过调试,发现我的程序通过rdi传递指针,我就在内存中找了块空间存放符号化变量,然后地址传给rdi就好了。

注意,这里有个问题,不能使用堆栈存放符号化变量,会导致程序只执行一次循环就退出,原因未知,待深入研究。

添加的代码如下:

flag_chars = [claripy.BVS('%d' % i, 8) for i in range(4)]   
flag = claripy.Concat(*flag_chars + [claripy.BVV(0,32)])
state.regs.rdi = 0x600FB0
passwd = 0x600FB0 # 找到内存空间
state.memory.store(passwd, flag)
state.memory.store(passwd+8, 0)

还原后的汇编F5结果如下:


总结:感觉自己能遇到这个问题,一是对angr的理解不够深入,会的东西太少;二是粗心,没有考虑到参数的初始化问题。说到底还是自己太菜了,55555

雪    币: 1284
活跃值: (1504)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
luoye_ATL 2021-5-10 16:00
1
精华数
RANk
1284
雪币
0
活跃值
关注数
粉丝数
0
课程经验
0
学习收益
0
学习时长
基本信息
活跃值  活跃值:活跃值
  在线值:
  浏览人数:0
  最近活跃:0
  注册时间:2020-09-22
勋章
能力值

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册