Pwnable.tw death_note
printable shellocode
这题还算简单,add时idx检查不严导致可以向上写got表,同时NX没开,因此我们先在heap里写shellcode,之后改puts_got执行shellcode。
但题目对输入的内容进行了限制:
1 | int __cdecl is_printable(char *s) |
因此我们构造的shellcode要符合条件,也即可打印的shellcode。
由于限制,mov指令无法使用了,但可以通过push,pop来替代。最致命的时’int 0x80’没了😱
看了P4nda师傅的博客,学到了还可以用sub byte ptr[eax + 0x35] , dl;sub byte ptr[eax + 0x34] , dl这样的执行对机器码进行修改。
由于int 0x80的机器码为 cd 80 (16进制),切在shellcode开始执行时edx存放shellcode首地址,因此构造eax=shellcode_addr,dl=0x60,之后再ptr[eax + 0x35]即shellcode结尾处写入’\x6b\x40’,通过执行改指令可以修正使其为0xcd和0x80,太妙了。
另外eax=0xb可以通过xor指令实现。
EXP:
1 | from pwn import * |