pwnable.kr第二遍--flag

本文介绍如何使用UPX工具进行文件压缩与解压缩,并通过一个实例详细讲解了从下载文件、确认文件格式、解压文件到最终获取flag字符串的全过程。文中还涉及了ELF格式文件、strip工具的使用及静态链接与动态链接的区别。
>>>>>flag
1.UPX命令
通用可执行文件压缩器
压缩里搞;解压速度快....
控制台应用程序,以命令行的方式进行操作,使用简单
upx [-1d...] [-qvfk] [-o file] file..
解压缩文件
upx -d flag -o flag_upx


2.xxd flag|tail
xxd用于将文件以二进制或者十六进制的形式输出
tail用于输入文件中获得尾部;默认十行


3.wine
进入https://wiki.winehq.org/Download
并按照教程一步步安装就好了
然后再命令行中'wine'会给出usage
然后直接执行'wine ida64.exe'
执行过程中提到有的安装包没有安装
点击安装就可以了


4.IDA查看string
f12或者view--->sub-view--->String


5.linux运行IDA-pro
网上说吾爱破解论坛中有提供IDA-pro的linux版本
我这次直接使用的是windows版本的Exe文件
所以就学着在linux下安装wine,在wine中运行exe简直很爽了


6.ELF
Executable and Linking Format:可执行可连接格式
relocatable 可重定向文件
executable  可执行文件
shared object 共享目标文件




7.怎么知道他是UPX压缩文件
xxd flag | tail
upx压缩标志(二进制文件中有UPX字段)


8.解题思路
此题目比较简单,主要是工具的使用
>首先下载flag文件,利用'file flag'命令查看文件格式
ELF 64bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped, with debug_info
>使用xxd flag | tail命令
可以发现有明显的UPX标记字段,说明文件是UPX压缩的
>使用UPX -d flag -o flag_upx解压缩文件
注意这里需要upx命令工具,首先安装
>将解压缩后的flag_upx在IDA中解析
可以看到明显的flag标记
追踪到string-view,可以看到完整的flag字符串的内容


9.stripped
strip工具
.out文件和elf文件都有符号表,包括所有的符号(程序的入口地址和变量额地址等等)
这些符号表可以用Strip工具剔除
elf文件的符号表在加载时起到关键作用,所以不可能完全stripped
而.out文件可以完全剔除


Stripped和not stripped的区别:
stripped:将程序中的符号表的信息剔除掉了,编译出来的可执行文件体积比较小
not stripped:保留了这些信息,所以便于调试


10.statically linked && dynamically linked
静态链接:可移植性好;文件大;调用函数在内存中多次存放
动态链接:可移植性差;文件小;多个程序可以共享内存中加载的库函数


11.在有些地方可以看到flag的部分信息,后边是'...'
表示该信息并不完整,所以还需要到string-window中去查看


12.其他的压缩文件都可以这样吗?
还是有相应的标识字段不一样


13.为什么不可执行??权限不够??
下载之后无法执行
输入'ls -l'查看flag和flag_upx(flag解压缩之后文件)
发现权限不足
使用chmod 777 flag/flag_upx
可以执行文件'./flag' './flag_upx'


UPX只能用来压缩可执行文件,可以认为是给可执行文件加壳了
压缩后的exe文件是可执行的


14.Windows上大部分可执行文件为PE格式
Linux里大部分可执行文件为ELF格式


15.with debug_info
是指改可执行文件支持debug调试
### pwnable.kr bof题目概述 pwnable.kr 是一个著名的在线渗透测试练习平台,bof(Buffer Overflow,缓冲区溢出)题目是其中经典类型。缓冲区溢出通常是由于程序没有正确检查用户输入的长度,导致输入的数据超出了缓冲区的边界,从而覆盖相邻的内存区域,可能改变程序的执行流程。 ### 解题思路与步骤 #### 1. 环境准备 首先需要在本地搭建好调试环境,安装必要的工具,如`gdb`(GNU调试器)、`pwntools`(Python 库,用于编写漏洞利用脚本)等。例如,使用`pwntools`可以方便地与远程服务器进行交互。 ```python from pwn import * # 连接到远程服务器 p = remote('pwnable.kr', 9000) ``` #### 2. 分析程序 - **反汇编**:使用`objdump`或`gdb`对目标程序进行反汇编,查看程序的汇编代码,了解程序的逻辑和函数调用关系。例如,使用`objdump -d bof`可以得到程序的反汇编代码。 - **检查漏洞点**:重点关注程序中存在缓冲区操作的函数,如`gets`、`strcpy`等,这些函数通常不检查输入的长度,容易引发缓冲区溢出漏洞。 #### 3. 确定缓冲区大小 通过调试程序,向程序输入不同长度的数据,观察程序的行为,确定缓冲区的大小。可以使用`gdb`设置断点,在关键位置查看栈的状态。 ```python # 构造不同长度的测试数据 test_data = 'A' * 10 p.sendline(test_data) ``` #### 4. 覆盖返回地址 当确定了缓冲区大小后,构造恶意输入,覆盖程序的返回地址。返回地址是函数调用结束后程序要跳转执行的地址,通过覆盖它可以改变程序的执行流程。 ```python # 计算返回地址的偏移量 offset = 44 # 假设偏移量为 44 # 构造恶意输入 payload = 'A' * offset # 获取目标地址(如系统函数地址) target_address = p64(0xdeadbeef) payload += target_address p.sendline(payload) ``` #### 5. 利用漏洞执行任意代码 - **调用系统函数**:如果程序中存在可利用的系统函数(如`system`),可以通过覆盖返回地址,将程序的执行流程引导到这些函数上,并传入合适的参数(如`/bin/sh`),从而获得一个 shell。 - **ROP 链**:如果程序中没有合适的系统函数可以直接调用,可以使用 ROP(Return Oriented Programming,面向返回编程)技术,通过拼接多个小的代码片段(gadget)来实现复杂的功能。 ```python # 构造 ROP 链 rop = ROP(elf) # 查找合适的 gadget pop_rdi = rop.find_gadget(['pop rdi', 'ret'])[0] bin_sh = next(elf.search(b'/bin/sh')) system_addr = elf.symbols['system'] # 构造 ROP 链 rop.raw(pop_rdi) rop.raw(bin_sh) rop.raw(system_addr) # 构造最终的 payload payload = 'A' * offset + str(rop) p.sendline(payload) ``` ### 技术分析 #### 缓冲区溢出原理 缓冲区溢出是由于程序对输入数据的长度没有进行有效的检查,导致输入的数据超出了缓冲区的边界,覆盖了相邻的内存区域。在栈上,函数调用时会保存返回地址等信息,当缓冲区溢出发生时,返回地址可能被覆盖,从而改变程序的执行流程。 #### 栈布局与内存管理 了解栈的布局对于利用缓冲区溢出漏洞至关重要。栈是一种后进先出的数据结构,函数调用时会在栈上分配空间,保存局部变量、参数和返回地址等信息。通过调试和分析栈的状态,可以确定缓冲区的位置和返回地址的偏移量。 #### 保护机制绕过 现代操作系统和编译器通常会采用一些保护机制,如 ASLR(地址空间布局随机化)、Canary(栈保护)等,来防止缓冲区溢出漏洞的利用。在解题过程中,需要了解这些保护机制,并寻找相应的绕过方法。例如,对于 ASLR,可以通过泄露程序的基地址来绕过;对于 Canary,可以通过泄露 Canary 的值来绕过。 ### 总结 解决 pwnable.kr 的 bof 题目需要掌握缓冲区溢出的基本原理、调试技巧和漏洞利用技术。通过不断地练习和实践,可以提高对漏洞的分析和利用能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值