DASCTF X CBCTF 2022九月挑战赛-Pwn buf 后面跟着一个libc的地址,可以leak libc 的基址下面跟着一个格式串漏洞,puts里面调用的strlen,改那个got为one_gadget 即可(这个题刚好有一个满足的gadget)栈溢出,但是只能覆盖返回地址,栈迁移做就行UAF 可以改fd (加或减去一个偏移)
ciscn 2022 pwn-newest_note复现 刚开始有个溢出(太菜了,其他师傅提醒才看出来)del 函数里面 free之后指针没有清0攻击思路:如果elf里面使用了stdout,等,那么IO函数里面取到的stdout就是bss段上的stdout,否则就是libc里面的stdout。IO函数位于libc里面,libc里面有一处地方可以泄露elf基址(这段区域是只读的)考虑alloc到heap数组上,然后修改成员为图中的地址,这样就可以leak elf的地址了(leak之后是为了后面修改free count做准备)。前提是得先leak lib
360chunqiu2017_smallest stack地址不好泄露,但是发现elf的入口处刚好保存了start地址,只要把rsp设置为这个位置就能再次利用溢出exp:from pwn import*#sh = process('./pwn')sh = remote('node4.buuoj.cn',29216)context.arch = 'amd64'syscall = 0x4000BEstart = 0x4000B0_context = SigreturnFrame()_context.rip = syscall_conte
*ctf-NaCl 不会去花就很难受,看了好久才手动还原出来C语言代码加密和解密都在这里了#include <stdio.h>#include <string.h>//unsigned int ExchangeBit(unsigned int data){ unsigned int ret = 0; ret |= (data & 0xff) << 24; ret |= ((data >> 8) & 0xff) << 16; ret
c语言scanf用法详解 看了一下glibc scanf的源码之后,对scanf的使用方法有了更深入的理解,下面给大家讲解一下scanf函数的用法.1.以%开头的字符串%[argpos$] [I'*] [maximum field width] [type modifiers] [arg]argpos: 指定了参数的位置I’*I:use locale’s digits': Group numbers*: 跳过这个参数maximum field width : 从输入的内容中最多读取几个字符type mod
glibc-2.23 _int_malloc函数流程分析 文章目录_int_malloc流程分析1.尝试在fastbin里面寻找2.尝试在small bin里面寻找3.触发malloc_consolidate4.for()循环:5 use top其他部分:1.关于last_reminder_int_malloc流程分析1.尝试在fastbin里面寻找若needbytes 是小于fastbin最大chunk的大小,根据needbytes计算出idx,在对应的bin里面看一下有没有chunk。若对应的bin并不是空的,那么取出一个chunk 名为victim,检
glibc-2.23 sysmalloc函数代码分析 基础知识: malloc_state 和 heap_info heap 就是一块大的内存区域,若不是main_arena,heap是mmap创建的,main_arena是sbrk拓展得到的(拓展失败也会调用mmap) (由于main_arena的heap在内存开始处没有保存heap的info,所以和非main_arena的heap还有稍微有点区别的)malloc_state 结构体是用来管理bins和heap的结构体,(top chunk 指向的就是一个heap的可用区域)。当我们从一个a
C语言文件操作 fopen的mode参数 当我们用c语言的库函数打开一个文件的时候,fopen的第二个参数指定了打开的方式.有r,w,a,r+,w+,a+等等…这些mode具体区别是什么呢,下面我给大家说明一下参考一下glibc-2.23的fopen源码:_IO_FILE * _IO_new_file_fopen (_IO_FILE *fp, const char *filename, const char *mode, int is32not64){ int oflags = 0, omode; int read_wr
buuoj刷题记录 - starctf_2019_babyshell 输入shellcode ,然后检查shellcode只要shellcode第一个字节是0就可以了,但是必须是有效的指令,否则无法识别会导致程序崩掉。先填一个\x00看一下,对应的opcode 是add后面的shellcode已经无法识别了.看一下intel开发手册,找到add指令可以看到对应的opcode是00,把后面的操作数补全(随便找个可以写的地址就行)就不会影响后面shellcode的解析了.然后就可以getshell啦Volume_2_325383_NoRestrictio
buuoj刷题记录 - [极客大挑战 2019]Not Bad 检查一下保护:程序很简单,存在栈溢出漏洞,只能溢出16个字节。只允许orw系统调用.前八个字节用来jmp rsp ,紧接着加上5个字节近转移 call到buff的开始处执行.这样就可以往buf里面写gadget来往指定地址处读入shellcode之后跳转到shellcode把flag读出来exp:from pwn import*#sh = process('./pwn')sh = remote('node4.buuoj.cn',29515)context.arch= 'x86_6
buuoj刷题记录 - wdb_2018_2nd_easyfmt 程序很简单,while(1)反复利用fmt漏洞:泄露libc地址:main函数是由__libc_start_main函数调用的,所以main执行时,ebp下面那个就是__libc_start_main中的地址,而__libc_start_main函数是位于libc中的,利用printf把返回地址打出来就可以泄露libc基址了.之后便可以劫持got了,直接改printf为system得需要修改4个字节,打远程还是算了,这里提供另一种方法.把printf的got改为某个gadget,这个gadge
buuoj刷题记录 - npuctf_2020_easyheap 题目给了add,show,edit,del函数问题在edit函数里面,重新编辑的时候可以溢出一个字节看一下create函数,只能分配大小为 24,和56的空间思路:覆盖下一个chunk的chunksize低字节达到修改chunk的大小,free 的时候会放到更大的tcache bin里面,之后malloc的时候会造成chunk重叠.下面是我的构造方法:把利用 0 把1中chunk2的size 改掉,改成0x40, (一会malloc的时候用到,注意只能分配大小为 56 和 24 的空间,(8.
c++虚表 1.Base,Derived,Derived2三个类每一个类都有一个虚函数表.表里储存了需要调用的虚函数的真正地址。2.每一个对象里面都有一个指针指向了虚函数表,是哪个类的实例,指向的就是哪个类的虚函数表。这个虚函数表指针会在对象构造函数内赋值。不管类继承了多少次,实例里面只有一个指针保存了一张虚函数表。先看一开始p1 和p2 的调用.,p1 ,和p2 实际上是Derived2 的实例跳到构造函数内看一下: 先是调用 Derived 的构造函数,然后把虚函数表地址保存到了this 指向的地..
buuoj刷题记录 - ciscn_2019_final_3 看了大佬们的思路才做出来的,这里只记录一下做题中踩的坑。1.add函数2.del函数free后没有把数组元素标记为0,存在UAF漏洞.思路是:1.double free 改fd 到 另一个chunk 的首地址处,然后修改chunksize ,原因是程序限制了分配大小为120字节,free到unsorted bin里面。2.free chunk 到unsorted bin里面3.double free 修改fd 到第二步中的chunk,之后便可以malloc 到unsorted bin处,然后
buuoj刷题记录 - pwnable_hacknote 查看程序保护:拖进IDA分析一下,Add函数正常,先创建八个字节的内存struct Node{{void* func_addr;void* content;}然后根据输入的size开辟相应大小的内存问题存在于DelNote函数中,free后没有置0看一下PrintNote函数:根据八个字节的前四个字节调用对应的函数,并把这个八个字节的首地址作为参数若Note被free后,还是可以调用Print函数的,由于不确定func_addr是什么,所以会出现问题.构造方法:先Add两
buuoj刷题记录 - linkctf_2018.7_babypie 检查程序保护:拖进IDA看一下,只有一小段代码,存在溢出漏洞main函数上面有个后门函数覆盖ret地址到后门函数即可,由于开启了PIE,和Canary,不能直接溢出下面这两行代码可以把canary打出来最后由于后门函数入口地址和返回地址只有低字节不同,所以覆盖掉返回地址的低字节即可.,不需要获取程序基址.exp:from pwn import*#sh = process('./pwn')sh = remote('node4.buuoj.cn',29231)payload = b'