第二届海啸杯部分题目Writeup
Misc签到题题目提供的1.zip解压出flag.txt,txt文件里面有大量意义不明的字符,尝试性使用base64解密,得到结果如下图:
首行有PNG、Adobe等字样,推测是解密后的明文是PNG文件十六进制文件。用python解密后写入到后缀名为png的文件中,查看图片内容,脚本如下:
1234567#./flag.txtimport base64file = open('1.png','w')encodestr = base64.b64decode('这里填入flag.txt中的密文'.encode('utf-8'))file.write(encodestr)file.close()
flag
老烟枪用binwalk分析图片,结果显示图片中有一个压缩包。使用命令binwalk -e cxk.png分离出压缩包,得到flag.png,用ps的水平翻转功能,得到正常flag
flag
表白这题就是可以百度到的png隐写操作—-修改图片宽高 ...
Bugku-Pwn5
前言2019年12月15日更新
学完ROP之后,重新做一下题目。bugku 5道 pwn 挺适合在学完 ROP 之后用来练习的。
网上对 pwn5 的 wp 视乎好像不是太详细,就做一篇比较详细解释的。
或者说是基于橘小白wp的补充 XD
审计看一下保护,只开了NX。
没有危险函数,如system、getshell等
main 函数中存在两个漏洞。首先是第10行的 printf 存在格式化字符串漏洞;其次是17行的 read 存在栈溢出。
12345678910111213141516171819202122232425int __cdecl main(int argc, const char **argv, const char **envp){ char s; // [rsp+0h] [rbp-20h] setvbuf(_bss_start, 0LL, 2, 0LL); setvbuf(stdin, 0LL, 1, 0LL); memset(&s, 0, 0x20uLL); puts(&::s); read(0, & ...
ZIP压缩包伪加密
前置知识ZIP文件的16进制文件可以分为压缩源文件数据区、压缩源文件目录区、压缩源文件目录结束标志。
每个区都有对应的文件头标记,结合实际16进制文件来解释各区的文件头信息。
压缩源文件数据区
16进制文件数据
描述
50 4B 03 04
zip类型头文件标识
14 00
解压文件所需要pkware版本
00 00
全局方式位标记(有无加密)
08 00
压缩方式
70 02
最后修改文件时间
01 4B
最后修改文件日期
B7 EF DC 83
CRC-32校验(1480B516)
03 00 00 00
压缩后尺寸(3B)
01 00 00 00
未压缩尺寸(23)
05 00
文件名长度
00 00
扩展记录长度
压缩源文件目录区
16进制文件数据
描述
50 4B 01 02
目录中文件文件头标记
1F 00
压缩使用的 pkware 版本
14 00
解压文件所需 pkware 版本
00 00
全局方式位标记(有无加密)
08 00
压缩方式
70 02
最后修改文件时间
01 4 ...
文件结构
图片的结构Gif一个GIF文件的结构可分为文件头(File Header)、GIF数据流(GIF Data Stream)和文件终结器(Trailer)三个部分。
文件头部分GIF署名(Signature)和版本号(Version)GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:”GIF”;文件版本号也是由三个字节组成,可以为”87a”或”89a”.具体描述见下表:
对应到实际文件中:
GIF数据流部分(GIF Data Stream)
这部分不是按照顺序记录,详细顺序参照上面的Gif总结构表
图象标识符(Image Descriptor)一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,图象标识符以0x2C(‘,’)字符开始,定义紧接着它的图象的性质,包括图象相对于逻辑屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成:
注释扩展(Comment Extension)这一部分是可选的(需要89a版本),可以用来记录图形、版权、描述等任何的非图形和控制的纯文本数据(7-bit ASCII字符), ...
内存取证-volatility
内存取证-volatility安装实测kali 7.x自带,而最新的kali 9.x没有
使用判断镜像信息,获取操作系统类型
1volatility -f ?.img/raw/... imageinfo
知道操作系统类型后,用--profile指定系统的操作类型
1volatility -f ?.img --profile=...
查看当前显示的notepad文本(提取某个程序)
1volatility -f file.raw --profile=WinXPSP2x86 notepad
查看当前运行的进程
1volatility -f file.raw --profile=WinXPSP2x86 psscan/pslist
扫描所有的文件列表(常常结合grep,即正则)
1volatility -f file.raw --profile=WinXPSP2x86 filescan
根据offset提取出文件
1volatility -f file.raw --profile ...
Pwnable.kr horcruxes
前言这题考的是ROP系统攻击。百度百科是这样介绍的:
简介:ROP全称为Return-oriented Programming(面向返回的编程)。是一种基于代码复用的攻击技术,攻击者从已有的库或可执行文件中提取指令片段,构建恶意代码。
内在特征:1. ROP控制流中,call和ret指令不操纵函数,而是用于将函数里面的短指令序列的执行流串起来,但在正常的程序中,call和ret分别代表函数的开始和结束;2. ROP控制流中,jmp指令在不同的库函数甚至不同的库之间跳转,攻击者抽取的指令序列可能取自任意一个二进制文件的任意一个位置,这很不同于正常程序的执行。比如,函数中部提取出的jmp短指令序列,可将控制流转向其他函数的内部;而正常程序执行的时候,jmp指令通常在同一函数内部跳转。
防范措施:ROP攻击的程序主要使用栈溢出的漏洞,实现程序控制流的劫持。因此栈溢出漏洞的防护是阻挡ROP攻击最根源性的方法。如果解决了栈溢出问题,ROP攻击将会在很大程度上受到抑制。
总结ROP就是主要利用栈溢出,操纵call、ret、jmp指令,实现程序控制流的劫持,跳转到任意一个位置。
题目ssh ...
Pwnable.kr unlink
预习知识什么是unlinkedunlinked 是堆溢出中的一种常见形式,通过将双向列表中的空闲块拿出来与将要free的物理相邻的块进行合并。(将双向链表上的chunk卸载下来与物理chunk合并)
unlink漏洞条件有3个以上的空闲chunk链表,其中最前面的chunk存在有堆溢出
unlink的触发当使用free函数释放正在使用的chunk时,会相应地检查其相邻的chunk是否空闲。如果空间则将相邻的chunk与free的chunk进行合并。
unlink有两个安全检测机制,都是针对chunk的header部分。
prev_size:记录上一chunk的大小
size:记录当前chunk的大小
fd:在链表中指向下一个空闲chunk
bk:在链表中指向上一个空闲chunk
判断一
1if(chunksize (p) != prev_size (next_chunk (p)))
此判断所代表的含义为检查将从链表中卸下的chunk其size是否被恶意的修改。记录当前size的地方有两处一个是为当前chunk的size字段和下一个chunk(物理地址上相邻的高地址 ...
pwn题查找字符串方法记录
记忆力不太好,简单记录一下,用作备忘假设现在有文件如下:
待 Pwn 程序:mypwn
libc 文件:libc.so
需要查找的字符串 /bin/sh 在上诉两个文件中都存在。
查找程序中的字符串0x0 IDA strings window将程序加载到 IDA 后,使用快捷键 shift+F12 打开 strings window ,查看程序中出现的全部字符。
0x1 Linux strings 命令12strings -a -t x mypwn | grep '/bin/sh'> 540
返回的是地址最低 3 位。因为就算随机化,最低 3 位地址也保持不变。
0x2 ROPgadget1ROPgadget --binary mypwn --string '/bin/sh'
0x3 pwntools search 方法123from pwn import *p = process('./mypwn')binsh = p.search('/bin/sh').next()
...