微信小程序
先用解包
1 | wedecode ./wxe4679cbcec91e410 |
wedecode要自己安装,网上可以自己找教程。

解包成功
找到validator.wasm
用wabt-1.0.37-windows将wasm —-> wat
1 | wasm2wat wasm文件 -o wat文件 |
1 | (module |
exp
1 | # 内存数据(十六进制字节) |
1 | flag{fae0b27c451c728867a567e8c1bb4e53} |
ood_canary
before_main
1 | __int64 before_main() |
main
1 | int __fastcall __noreturn main(int argc, const char **argv, const char **envp) |
good_news
1 | unsigned __int64 good_news() |
exit_a
1 | unsigned __int64 __fastcall exit_a(int a1) |
vuln
1 | unsigned __int64 vuln() |
1 | Arch: amd64-64-little |
开启了canary,但是不影响
先看good_news puts的被放在了bss段bss:0000000000404080 bss,name在bss:0000000000404060 name,然后有个
1 | printf("Great, the good news is that I know your real name,%s\n", (const char *)buf); |
我们可以利用取个0x20的name,如果数据中没有空字节,name 不会以空字节终止,我们就可以利用其接着泄露出puts的地址。
接着看vuln, read(0, buf, 0x40uLL);存在栈溢出,但是能利用的只有0x10正好是栈迁移的标志。
但是我们还缺少一个栈的地址,可以在exit_a将栈地址放入bss段再到good函数泄露出栈的地址,然后再用栈迁移getshell。
exp
是战队里一个师傅写出来的。
1 | #!/usr/bin/env python3 |
但是我在本地复现,查看bss段
1 | pwndbg> x/20gx 0x00404020 |
puts的地址0x000079ba9ac87be0和给的libc不一样,暂时还不知道哪里的问题。
OK我发现问题在哪里了,原来它加载的是我本地libc.so.6不是题目给的。直接换用自己的libc.so.6就可以打通了。