-
-
[原创]DWARF字节码 与 libgcc_s.so.1
-
发表于:
2023-6-2 23:44
7610
-
[原创]DWARF字节码 与 libgcc_s.so.1
今年的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
find_bytes = bytes.fromhex( "415741564155415455534881EC2802000048894C24204839F70F83710600" )
data = idc.get_bytes(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 )
|
有兴趣的朋友可以试一试
(没有进行很认真的研究,如有错误,感谢斧正
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!