ret2shellcode
开始正式学习shellcode了!
ret2shellcod前置基础大端序与小端序:
大端序和小端序是指计算机存储多字节数据类型(如整数、浮点数等)时字节的排列顺序。
大端序:一个多字节值的最高位字节(即“大端”)存储在最低的内存地址处,其余字节按照大小递减的顺序存储。这种排列方式类似于我们写数字时从最高位到最低位的顺序。
例如一个16位的二进制数0x1234在大端序存储系统中,它的存储方式如下:
123内存地址 数据0x00 0x120x01 0x34
小端序:一个多字节值的最低位字节(即“小端”)存储在最低的内存地址处,其余字节按照大小递增的顺序存储。这种排列方式类似于我们从最低位到最高位读取数字的顺序。
使用上面相同的16位二进制数0x1234,在小端序存储系统中,它的存储方式如下:
123内存地址 数据0x00 0x340x01 0x12
大多数现代个人电脑和服务器使用小端序存储,而某些大型机、网络协议和旧的计算机系统则使用大端序。
系统调用32位程序执行系统调用获取shell
12345678910void __nor ...
CTFshow刷题日记53-55
爆破”Canary” pwn53分析:题目hint:”再多看一眼就会爆炸”
可能会遇到爆破
checksec
IDA分析
main函数:
12345678int __cdecl main(int argc, const char **argv, const char **envp){ setvbuf(stdout, 0, 2, 0); logo(); canary(); ctfshow(); return 0;}
canary函数:
12345678910111213int canary(){ FILE *stream; // [esp+Ch] [ebp-Ch] stream = fopen("/canary.txt", "r"); if ( !stream ) { puts("/canary.txt: No such file or directory."); exit(0); } fread(&global_canary, 1u ...
汇总
前言此篇文章是因为平时找一些指令要到处翻文章感觉有点麻烦就做了一些知识点的小汇总。
内容包括Linux指令、找ROPgadget指令、64位程序传参寄存器、GDB调试,pwntools单独放在另一篇文章了感兴趣的师傅可以在博客主页翻翻看
Linux常用指令nc1nc 域名 端口号
nc用于连接远程靶机,是Linux中的一个网络工具(还有很多其他用法但不常用就不列举了)
ssh1ssh 用户名@题目地址 -p题目端口号
ssh是一种网络协议,用于安全的远程登录到计算机系统
ls1ls
ls用于列出当前工作目录下的文件或子目录
pwd列目录1pwd
pwd显示当前工作目录的内容
chown程序提权1chown 777 文件名
该指令用于将程序变为可读可写可执行,即改变程序的权限
虚拟机连不上网?多半是DNS(域名系统)出问题了
一般我习惯吧DNS设置成8.8.8.8(谷歌的公开提供的公共服务器之一)
当虚拟机连不上网,打不开浏览器先尝试ping 8.8.8.8测试主机之间的连通性(检查网路连接的状态与质量)
网络正常的话是这样
不正常的话用这个
1sudo vim /etc/r ...
静态链接之mprotect
静态链接之mprotect这篇文章针对ctfshow上的49,50题
什么是mprotect函数meprotect函数可以用来修改指定内存页的权限为可读、可写、可执行。
大多可写的部分都不可执行,利用该函数修改后可传入shellcode来获取shell
函数原型:
1int mprotect(const void*start,size_t len,int prot);
第一个参数*start是指向需要进行操作的地址
第二个参数len是地址往后多大的长度
第三个参数port是要赋予的权限
区间开始的地址start必须是一个内存页的起始地址(地址的后三位为0,0x1000=4096u),指定的内存区间必须包含整个内存页(4KB=4096B)
区间长度len必须是页大小的整数倍。
mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值
prot可以取一下几个值,并且可以用”|”将几个属性合起来使用:
PROT_READ:表示内存段内的内容可写;
PROT_WRITE:表示内存段内的内容可读;
PROT_EXEC:表示内存段中 ...
pwntools
pwntools的使用该板块会持续更新,学一点写一点
学习资料来源于:1
导入pwntools库1from pwn import*
设置基本信息1context(os='linux',arch='AMD64',log_level='debug')
os是靶机的操作系统类型
arch是题目的架构,一般是AMD64(64位)或i386(32位)
log_level是指日志输出等级,设置为debug可以在脚本运行时输出我们具体发送了什么信息,靶机反馈了什么信息。
连接远程靶机1io = remote("ip",port)#前者为靶机地址,后者为端口号
1io = ssh(host='ip',user='用户名',port=端口号,password='密码')
本地调试1io = process("./pwn")
发送信息12345678p.send(payload) # 直接发送payloadp.sendline(paylo ...
ret2libc
ret2libc前置基础libc常用于处理动态链接程序,动态链接:程序在运行或加载时,在内存中完成链接的过程,即系统库和自己编写的代码分割成两个独立的模块,等到程序运行时再将这两个模块进行链接。详细介绍可以看指南摘要的动态链接部分
其具有延迟绑定的特点,只有当函数第一次被调用时,动态链接器才进行符号查找、重定位等操作,如果未被调用则不进行绑定
ELF文件通过过程链接表和GOT的配合来实现延迟绑定,每个被调用的库函数都有一组对应的PLT和GOT。(plt里存放的是汇编指令,用于跳转到got,got里存放了地址 )
工具指令ROPgadget
获取gadget地址,--binary参数指定文件,可以是可执行文件或libc文件,grep用于筛选,--string用于筛选字符串
通过pop rdi;ret可以将栈地址中的值传给rdi寄存器,其他寄存器同理,故p64(pop_rdi_ret)+p64(rdi_content)即可控制rdi寄存器的值为rdi_content
12345$ROPgadget --binary pwn --only 'pop|ret' | grep ...
极客大挑战2024复现(更新中)
ez shellcode分析checksec
发现开了nx,没开canary
分析main函数
发现第一次read获取输入填入bss段的shellcode中,但bss段可读可写不可执行,找找有没有提权函数,没开canary可以利用gets部分截取执行流。
发现提权函数gift(真的是一个好gift)
mprotect()函数将bss段的shellcode部分设置为可执行
mprotect()函数注释
mprotect(shellcode, 0x500uLL, 4) 是一个调用 mprotect() 函数的语句,其作用是改变从地址 shellcode 开始、长度为 0x500 字节(即1280字节)的内存区域的保护属性。这里的参数解释如下:
shellcode:这是指向需要修改权限的内存区域起始地址的指针。
0x500uLL:表示要修改权限的内存区域的长度,单位是字节。这里使用无符号长整型(unsigned long long),确保可以处理较大的值。
4
:新的保护标志,通常代表可读、可写和可执行权限。在Linux中,这个值通常是通过宏定义组合而成的:
PROT_REA ...
基础学习
[TOC]
建立学习参考目标
(1)短期参考比自己优秀的同龄人。阅读他们的文章和工作成果从细节中观察他们的学习方 式和工作方式。
(2)中期参考你的方向上的业内专家。了解他们的成长轨迹’跟踪他们关注的内容。
(3)长期参考业内老牌企业和先锋企业把握行业发展、技术趋势’为未来做积累
二进制文件从源代码到可执行文件编译原理编译器的作用是读人以某种语言(源语言)编写的程序,输出等价的用另一种语言(目标语言) 编写的程序。
GCC编译GCC编译主要包括四个阶段:预处理、编译、汇编、链接。*(-o 选项用于指定编译后生成的输出文件名)*
1gcc hello.c -o hello //终端运行即可获得可执行文件hello
hello.c–>hello.s–>hello.o
预处理将#开头的预处理指令转换后直接插入程序文本中,得到另一个c程序 hello.i
1gcc -E hello.c -o hello.i //-E可以单独执行预处理
预处理的一些处理规则如下:
递归处理#include预处理指令将对应文件的内容复制到该指令的位置;
删除所有的#define指令并且在 ...
ret2text
函数压入栈中是由上往下由栈底到栈顶,通过payload将数据压入栈是由下往上由栈顶往上压入到栈底
未开保护存在可利用函数类(地址跳转)有打印flag的函数什么保护都没开,存在gets函数有栈溢出漏洞,有打印flag的函数。
思路:利用栈溢出覆盖原函数到其ebp,用flag的地址覆盖原函数返回地址,以达到运行打印flag函数的效果
12345678910111213141516171819202122from pwn import *# 设置 pwntools 的上下文环境context(arch='i386', os='linux', log_level='debug')# 连接到远程服务器io = remote("pwn.challenge.ctf.show", 28182)# 加载本地二进制文件elf = ELF('./pwn')# 获取 get_flag 函数的地址flag = elf.sym['get_flag']# 构造 payload,cyclic用于生成 ...
2024玄武杯
序:玄武杯pwn只出了两题签到题有点可惜,但是还是学到了很多东西(下次不会再被保护吓到了!!)
Miscmisc0:一题图片识别题,刚开始还没头绪结果直接公布答案了qwq,看了学长的wp后发现了用谷歌识图就出来了
misc1:编码转换,给了一串二进制题目提示组cp,猜测应该要转为字符故首先尝试将其转为ASCII字符,出现一段有cp,的字符串,拖工具一键解码没出来,看元素只有了两个所以试着改了一下摩斯码,把c换成 . 把p换成 - ,当作分隔符,(因为没想到写脚本转就手打了,打完之后眼睛花了还出错了好几次,下次一定写脚本转),转换之后解码包裹得解,后来查文章发现cp也是摩斯码的一种表现形式
misc2:信息查找题,给了一张图片查该飞机在当天10点经过哪个城市
从图片中可以看到飞机机翼上有飞机的编号B-20A6,另一架飞机上有航空公司名字且两架飞机的logo一样故确认为中国国际航空公司的飞机,打开文件属性发现备注了拍摄时间2024年10月12号00:00故确认了范围,接下来寻找能够查航空轨迹的工具,我用的是航旅纵横里面可以用航班号、飞机编号查具体时间的飞机的飞行轨迹。
misc3:sno ...