今年的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 )
|
(没有进行很认真的研究,如有错误,感谢斧正
更多【DWARF字节码 与 libgcc_s.so.1】相关视频教程:www.yxfzedu.com