ciscn_2019_final_5
buuctf刷题记录——ciscn_2019_final_5ida查看,常见的堆题格式1.add函数
2.dele函数
3.edit函数
漏洞分析如上所说,本题地址存放比较特别,但是如果index为16,并且原地址第五位为0,就会导致地址被修改而我们第一次申请时候地址最低12bits一般为0x260,即0010 0110 0000,和16即0001 0000或,就变成了0010 0111 0000即为0x270,我们就可以在chunk0的content中伪造一个chunk头部,把它释放之后再申请我们就能利用它控制下一个chunk了
思路1.添加一个note[0],编号为16,size为0x10,内容为p64(0)+p64(0x31),再添加一个note[1],编号为1,size为0xc0(这个大小正好可以包括住content和size数组)2.释放note[0]和note[1],重新申请一个0x20大小的note[2],把note[1]头部size改为0x21,fd改为content数组0x6020e03.申请一个0xc0大小的note[3],再申请同样大小的note[4],填入fre ...
realloc用法
realloc的几个特殊用法(摘自官方WP)size == 0 ,这个时候等同于freerealloc_ptr == 0 && size > 0 , 这个时候等同于mallocmalloc_usable_size(realloc_ptr) >= size, 这个时候等同于editmalloc_usable_size(realloc_ptr) < szie, 这个时候才是malloc一块更大的内存,将原来的内容复制过去,再将原来的chunk给free掉
buu——ciscn_2019_final_2
ciscn_2019_final_2步骤1.例行检查,64位程序,保护全开
2.本地没有flag文件,远程连接一下,经典的堆题的菜单
3.64位ida载入
init()
allocate(),只可以申请0x20或者0x10的chunk
delete()
show(),show只能调用3次
bye_bye
这道题的关键点在于文件流的知识dup2 用来复制文件描述符:int dup2 (int oldfd,int newfd)_fileno 是用来规定 fd 所指向的文件流的,init()将flag的fd改成了666,所以我们只要想办法把 stdin 的 _fileno 改成 666 即可,这样在之后 scanf 就会将 fd == 666 (flag)的内容输入到 & v0 中,然后我们就可以输出 flag 的内容了
1.分配足够多的 tcachebin 使其合并进入 unorted bin 。2.通过 unsorted bin 的 fd 指针泄露 libc 的基址,并计算出 fileno 的地址。3.运用 double free 与 house of spiri ...
House Of Force
原理House Of Force 是一种堆利用方法,但是并不是说 House Of Force 必须得基于堆漏洞来进行利用。如果一个堆 (heap based) 漏洞想要通过 House Of Force 方法进行利用,需要以下条件:
能够以溢出等方式控制到 top chunk 的 size 域
能够自由地控制堆分配尺寸的大小
简单示例我们这里通过一个示例来说明 HOF 的利用,这个例子的目标是通过 HOF 来篡改 malloc@got.plt 实现劫持程序流程
123456789int main(){ long *ptr,*ptr2; ptr=malloc(0x10); ptr=(long *)(((long)ptr)+24); *ptr=-1; // <=== 这里把top chunk的size域改为0xffffffffffffffff malloc(-4120); // <=== ...
爆破脚本
我比较喜欢这么写( > _ < )
123456789101112from pwn import *while True: try: sh = remote('node4.buuoj..cn', 29420) ''' 这块写主要代码 ''' sh.sendline('cat flag') sh.recvline_contains('flag', timeout=1) sh.interactive() except: sh.close()
格式化工具fmtstr_payload
fmtstr_payload(offset, writes, numbwritten=0, write_size=‘byte’)
第一个参数表示格式化字符串的偏移
第二个参数表示需要利用%n写入的数据,采用字典形式,我们要将printf的GOT数据改为system函数地址,就写成{printfGOT:systemAddress};
第三个参数表示已经输出的字符个数
第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写
一般是:
12payload=fmtstr_payload(offset, {printfGOT:systemAddress})r.sendline(payload)
格式化字符串在栈和非栈上(bss)的运用
栈上:我常用%s和%p来泄露libc基址和pie地址,用%hhn,%hn,%n来修改地址内容
例题:buuctf上的wdb_2018_2nd_easyfmt看下ida:
主函数很简单,在printf处有格式化字符串漏洞,可以重复利用,此题没有后门函数,buf在栈上。
思路:1.利用格式化字符串漏洞泄露libc,求出system地址,并算出偏移。
2.将printf_got地址内容改成system地址,再次调用时输入bin/sh\x00(将buf赋值成bin/sh\x00),执行printf时便提权了。
重要步骤:1.格式化字符串泄露libc:1payload1=p32(printf_got)+"%6$s"
2.格式化字符串改地址内容:方法一:将printf_got高低地址分开改值
1234sys_high = (sys >> 16) & 0xffsys_low = sys & 0xffffpayload = '%'+str(sys_high)+'c%13$hhn'+'%'+ ...
JarvisOJ level4
JarvisOJ level4这题与level3相比就是就是题目并没有给出对应的libc文件,这里就要学习使用一波DynELF函数了,这是pwntools的一个函数,使用前请确认安装完整pwntools工具。前言:DynELF函数是通过已知函数,迅速查找libc库,并不需要我们自己本身知道对应版本的libc文件。这是DynELF函数使用的一个模板:
12345678def leak(address): payload=pad+p32(writeplt)+ret1+p32(1)+p32(address)+p32(4) io.sendline(payload) leak_sysaddr=io.recv(4) #print "%#x => %s" % (address, (leak_sysaddr or '').encode('hex')) 这里是测试用,可省略。 return leak_sysaddrd = DynELF(leak, elf=ELF("对应文件"))sys ...
大牛杯uaf
pwn02-uaf查看ida 主要用到以下函数1,主函数
三个功能
2,do_new函数
此处主要用Text添加chunk,Text一次会申请两个chunk,第一个主要保存以下内容
和这个一致
3,do_del函数和free函数
do_del是执行v3+4地址,也就是free函数,以v3地址为参数
4,do_dump函数和printf函数
do_dump是执行v3地址,也就是printf函数,以本身地址为参数
介绍records(0x0804B060)在这题records就是每Text一个chunk,会将储存printf地址,free地址和数据地址的地址放在records[Index]处
例如,此时records为
方法一 简单uaf
这里
在show(0)时便会执行sys,以为参数,因为0x080484f0识别不出,而加分号
所以会执行sh 。
其实也可以不用show(0)
将show(0)改为free(0),再做一下改动也可以
这样就不用加分号了。
exp123456789101112131415161718192021222324252627 ...
UAF例题-----HITCON-training lab 10----hacknote
功能分析我们可以简单分析下程序,可以看出在程序的开头有个 menu 函数,其中有
1234puts(" 1. Add note ");puts(" 2. Delete note ");puts(" 3. Print note ");puts(" 4. Exit ");
故而程序应该主要有 3 个功能。之后程序会根据用户的输入执行相应的功能。
add_note根据程序,我们可以看出程序最多可以添加 5 个 note。每个 note 有两个字段 put 与 content,其中 put 会被设置为一个函数,其函数会输出 content 具体的内容。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546unsigned int add_note(){ _DWORD *v0; // esi int i; // [esp ...