首页
社区
课程
招聘
[原创]DWARF字节码 与 libgcc_s.so.1
2023-6-2 23:44 6866

[原创]DWARF字节码 与 libgcc_s.so.1

2023-6-2 23:44
6866

今年的CISCN有一道DWARF字节码题目,和去年的DSCTF如出一辙,但这两道题还是有点区别的,区别是就是CISCN的DWARF字节码采用的是静态编译。
比赛的时候我没有按照常规方法来做(实际上是当时不知道这个是DWARF字节码),而是通过硬调的方式发现了一个由DWARF形成的vm虚拟机函数,之后通过解析这个虚拟机拿到了最后的flag
在赛后复盘的时候,我尝试调试DSCTF的那道非静态编译的程序,通过跟进系统函数的方式,同样找到了一个由DWARF字节码形成的vm虚拟机函数:
图片描述
经过对比和研究,我发现 liggcc_s_so.1 文件中存在一个函数,他能以vm虚拟机的形式解析DWARF字节码,在程序运行的时候,无论是DSCTF非静态编译的DWARF字节码还是国赛的静态编译字节码,都会在 liggcc_s_so.1 文件的这个个函数中动态生成vm虚拟机:
图片描述
这个函数具有固定的特征码,也就是说,以后我们只要再遇到这种DWARF字节码类型的题目,可以选择直接搜索特征码的方式定位到DWARF形成的虚拟机的位置
我从ubuntu22 下拷贝出了 libgcc_s.so.1文件,并在该文件中找到了这个函数,函数地址偏移为0x000000000015E40

 

初略提取出函数特征码如下:

1
bytes.fromhex(415741564155415455534881EC2802000048894C24204839F70F83710600)

之后我们就可以通过IDApython脚本在内存或数据中定位到vm函数的位置了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#搜索
import idaapi
import time
ti = time.time()
begin = 0000000000000000
end = 0x000000000019BE5         # 最好查看内存或数据布局后,再决定end的地址位置
find_bytes =bytes.fromhex("415741564155415455534881EC2802000048894C24204839F70F83710600")   #
data = idc.get_bytes(begin, end - begin) 
#data = idaapi.dbg_read_memory(begin, end - begin)#或者通过内存定位
find_adddr = data.find(find_bytes)
if find_adddr == -1:
    print("No Find\n")
else:
    print(hex(find_adddr + begin))
 
print(time.time()  -ti )

有兴趣的朋友可以试一试

 

(没有进行很认真的研究,如有错误,感谢斧正


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (3)
雪    币: 8283
活跃值: (4811)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
v0id_ 2023-6-4 10:38
2
0
感谢分享
雪    币: 8731
活跃值: (5488)
能力值: ( LV13,RANK:296 )
在线值:
发帖
回帖
粉丝
sunfishi 4 2023-6-4 12:14
3
0
mark
逆dwarf的vm虽然算绕了远路,但对于理解字节码还是有所帮助的
雪    币: 19410
活跃值: (29069)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-6-4 16:39
4
1
感谢分享
游客
登录 | 注册 方可回帖
返回