自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(165)
  • 资源 (1)
  • 收藏
  • 关注

原创 ByteCTF 2020 pwnandroid

pwndroid一个安卓端程序,native层是简单的菜单程序,其中edit功能没有检查长度,可以溢出,并且没有使用\0截断字符串,在show的时候可以泄露后续的数据难点在于如何进行交互,程序注册了JSBridge用于与js进行交互,其中该接口对象在js中的对象名为_jsbridge该对象有一个call函数因此,在javascript里,可以使用javascript:_jsbridge.call设置好参数后就能调用到对应的函数。溢出漏洞利用,覆盖函数指针为system,执行n

2020-10-27 15:05:25 1312

原创 骇极杯_2018_momo_server(条件竞争UAF)

骇极杯_2018_momo_server(条件竞争UAF)首先,检查一下程序的保护机制然后,我们用IDA分析一下Count功能开启了一个线程该线程会异步进行堆的free操作,其中注意到free(ptr[i]->name)后,没有将name指针清零,并且该循环尾部会休眠1s。结尾会将ptr指针清零在add函数中,如果name已存在,那么仅更新count和flag。因此,我们在ptr[i]被清零之前,通过add更新count和flag,这样,name就会被二

2020-09-14 20:56:36 878 2

原创 watevr_2019_5x5_lightsout

watevr_2019_5x5_lightsout根据这里的越界异或,将返回地址改为one_gadget。其中注意到能够异或的值是有限定的,可以异或(7 << (i - 1))的值,如下00000011000001110000111000011100001110000111000011100000110000001000000000000000可以发现,这样值已经可以构造任意的值了。如下exp,是假设存在借位的情况,因此需要一定的概率才能成功#codin

2020-08-16 14:04:40 510 2

原创 gyctf_2020_foolish_query(C++中的shared ptr指针的误用)

gyctf_2020_foolish_query(C++中的shared ptr指针的误用)首先,检查一下程序的保护机制然后,我们用IDA分析一下,在Query的构造函数中,如果我们查询的name存在,则将对应的对象从容易里取出,获得其shared_ptr对象,关键在于调用了shared ptr的get函数,取得了对象的指针值,用这个指针值创建了一个新的shared_ptr对象。漏洞点在于,从一个shared_ptr对象里取得了被托管的对象的地址值创建了一个新的shared_ptr对象,因此,前

2020-07-26 19:36:18 672

原创 X-nuca_2018_revenge(控制程序流程的新姿势+多字节的xchg指令会清零寄存器高位)

X-nuca_2018_revenge(多字节的xchg指令会清零寄存器高位)首先,检查一下程序的保护机制然后,我们用IDA分析一下,bss上存在无限溢出由于该程序是静态编译,我们可以覆盖到下方某些函数指针,我们可以将__printf_arginfo_table虚表指针覆盖,指向我们可控的地方。这样printf调用时,就调用相应的函数,但是rdi、rsi、rsp这些不可控这时有一个巧妙的方法,我们让程序执行到000000000046B9A8 mov rbx, ...

2020-07-26 19:04:16 627

原创 n1ctf2018_null(通过劫持线程arena达到任意地址分配)

n1ctf2018_null(通过劫持线程arena达到任意地址分配)首先,检查一下程序的保护机制然后,我们用IDA分析一下,主函数启动了一个线程在线程里,是一个循环其中输入函数存在溢出,由于a2没有更新,因此,如果将数据分成2部分读入的话,第二次,仍然可以读入a2个数据,从而溢出。溢出尺寸比较大,如果能够覆盖到线程arena,那么就能将fake_chunk链接到fastbin,进而分配过去。但是arena是先mmap出来的,heap是过后才分配出来,因此,线程heap的

2020-07-26 18:33:27 2204

原创 线程PWN之gkctf2020 GirlFriendSimulator

线程PWN之gkctf2020 GirlFriendSimulator首先,检查一下程序的保护机制然后我们用IDA分析一下,一个多线程程序在线程里的delete功能,存在UAF但是由于add功能次数限制,无法在线程里完成这个UAF的利用在glibc中,线程有自己的arena,但是arena的个数是有限的,一般跟处理器核心个数有关,假如线程个数超过arena总个数,并且执行线程都在使用,那么该怎么办呢。Glibc会遍历所有的arena,首先是从主线程的main_arena开

2020-07-25 17:14:12 1201

原创 twctf_2018_bbq

twctf_2018_bbq首先,检查一下程序的保护机制然后我们用IDA分析一下在delete功能里,ptr指针存在未初始化的漏洞,因此可以free在栈上伪造的地址,条件是ptr->flag得满足要求,另外index下标没有检查,这也是一个漏洞。由于getInput后面的length固定,因此我们最开始只能将栈上的ptr指针低1字节覆盖为0,因此,我们需要在堆里对应的伪造伪造好chunk,然后free掉,形成ovelap chunk。Free时还要特意伪造好flag,否

2020-07-25 14:14:08 417

原创 ciscn_final_7(黑盒测试)

ciscn_final_7(黑盒测试)首先检查一下程序的保护机制然后,我们用IDA分析一下程序比较复杂比较难逆向,其大致原理是fork了子进程做为一个调试进程,然后主进程里通过int 3中断通知调试器设置相应的寄存器,从而执行到其他地方。由于整个程序主逻辑全部使用中断来实现,比较难逆向,因此我们直接黑盒测试了。首先通过枚举choice的选项,得到了一下选项#110 add#120 edit#238 del#386 exit然后就进行测试,发现d

2020-07-25 13:14:32 365

原创 hack_lu_2018_heap_heaven

hack_lu_2018_heap_heaven首先,检查一下程序的保护机制然后我们用IDA分析一下,这个free没有检查范围,因此可以任意地址free。我们只要想办法free掉state,然后控制funcs指针,即可执行任意代码但是程序中我们不能自己malloc,因此无法将其再申请回来进行控制。查看state结构体其位置与堆块的fd位置一样,因此,我们首先在fastbin里放一个chunk,然后再free掉state,这样,funcs就指向了第一个chunk,而func

2020-07-25 13:03:29 384

原创 jarvisoj_hsys(hash散列表)

jarvisoj_hsys(hash散列表)首先,检查一下程序的保护机制然后,我们用IDA分析一下,在show功能里,如果cur_id为0,即admin账户,则v36为定值5,这样使得n变大,memcpy就有可能造成栈溢出,如果能让name长一些,那么info的内容就可以溢出更多一点。为了寻找这样的name,首先要求hash(name) = 0,并且strlen(name)尽可能大,我们来看看hash计算的方法。首先是利用一个hash函数生成一个hash初值,接着为了解决hash

2020-07-25 12:28:09 551

原创 starctf2018_note(栈上的null off by one)

starctf2018_note(栈上的null off by one)首先,检查一下程序的保护机制然后,我们用IDA分析一下,在add函数里的scanf(“%256s”,&s)存在null off by one,其结果是将在栈里的rbp值低1字节覆盖为0。将栈里rbp的值低1字节覆盖为0后,其结果导致main函数的rbp上移,这样,我们就可以在add里的可控缓冲区里控制main函数里scanf的格式化字符串指针,我们将其修改为%236s的地址,这样就能在main函数里进行栈溢出

2020-07-25 12:07:13 546

原创 diary_mna_2016

diary_mna_2016首先,检查一下程序的保护机制然后检查一下沙箱机制,发现禁用了execve还有open函数,但是没有堆sys_number的范围进行判断,因此,可以利用retf切换到32位模式绕过沙箱。然后,我们用IDA分析一下,输入函数存在off by one。程序自己用链表实现了一个堆块管理器。其free功能使用的是unlink,将堆块取出、合并等操作,但是缺少链表完整性检查这里,我们unlink不能直接将got表修改为system_add.

2020-07-24 23:14:10 368

原创 [中关村2019]two_string

[中关村2019]two_string首先,检查一下程序的保护机制然后,我们用IDA分析一下,合并的时候,使用的是strcat,但是total_size的计算,没有考虑如果原size为0的情况。在add里面,我们可以申请size为0的堆。根据堆的性质,malloc(0)和malloc(0x10)申请的是同一个大小的chunk,假设在fastbin里有多个chunk,malloc(0)取得的chunk其fd有一个指针,没有被清空,这样strcat就可以把这个指针追加进去,从而后面的

2020-07-24 21:37:35 315

原创 HITCON_2018_Hackergame_2018_calc(一个容易忽略的计算机整数小知识)

HITCON_2018_Hackergame_2018_calc用IDA分析一下,程序注册了异常信号处理函数。该函数可以执行命令现在,只要想办法触发异常即可。程序中过滤了除0异常,其实还可以利用-0x80000000/-1来触发异常。我们可以做个试验#include <stdio.h>int main() { int a,b; scanf("%d%d",&a,&b); int c = a/b; pri...

2020-07-24 21:10:31 430

原创 car_market_asis_ctf_2016

car_market_asis_ctf_2016首先,检查一下程序的保护机制然后,我们用IDA分析一下,程序功能比较多,这里不做分析了。漏洞点在这,输入函数存在off by null。该函数在set_customer_name里调用可以将comment指针的低1字节覆盖这样,我们只需要在对应的位置伪造好chunk,然后free掉形成overlap chunk即可控制,构造麻烦了点,为了能够通过fastbin attack申请到bss上控制堆指针,我们还需要利用co

2020-07-24 19:33:19 304

原创 [FireshellCTF2020]Firehttpd

[FireshellCTF2020]Firehttpd首先,检查一下程序的保护机制然后,我们用IDA分析一下,在referer字段的解析里存在格式化字符串漏洞,由于是主进程fork子进程,因此,我们泄露的数据第二次不会改变仍然可以使用。那么,我们利用格式化字符串漏洞,将文件名指针修改指向我们可控的地址,这样就可以读取我们想要的文件了。#coding:utf8from pwn import *ip = 'node3.buuoj.cn'port = 28726sh = rem

2020-07-24 19:25:14 503

原创 starctf_2019_quicksort

starctf_2019_quicksort首先,检查一下程序的保护机制然后,我们用IDA分析一下,栈溢出,可以将ptr指针覆盖掉,因此,我们可以任意地址写。那么,我们可以将free的got表修改为main函数,这样就可以进行多次利用,同时后面的printf可以泄露地址#coding:utf8from pwn import *from LibcSearcher import *#sh = process('./starctf_2019_quicksort',env={'

2020-07-24 19:09:59 305

原创 鹏城杯_2018_note

鹏城杯_2018_note首先,检查一下程序的保护机制然后,我们用IDA分析一下,在edit功能里,index的值可以被nptr溢出覆盖,因此,我们可以控制index的值,这样,我们就可以在GOT里写入一个堆地址。由于没有开启NX保护,我们只需要再在堆里布置shellcode即可。#coding:utf8from pwn import *context(os='linux',arch='amd64')#sh = process('./2018_note')sh = rem

2020-07-24 18:51:07 342

原创 babyheap_hitcon_2016

babyheap_hitcon_2016首先,检查一下程序的保护机制然后,我们用IDA分析一下,输入函数存在off by null漏洞通过这个off by null,可以将content指针低1字节覆盖为0,也就是相当于content指向的地方在上方去了。因此,我们只需要在上方的位置,伪造一个合适的chunk,然后free掉,这样,unsorted bin和fastbin就有重合了。程序中,仅仅关闭了stdout的缓冲区,没有关闭stdin的缓冲液因此,通过功能4,我

2020-07-24 18:41:37 362 1

原创 wdb_2018_4th_pwn2(爆破随机数为0)

wdb_2018_4th_pwn2(爆破随机数为0)首先,检查一下程序的保护机制然后,我们用IDA分析一下,功能1栈溢出,但是有canary功能3格式化字符串,当仅能泄露一个值。功能2是一个递归调用,多次递归,可以在栈里多处位置留下canary的值功能9011也是一个栈溢出,但是需要正确的key才能进行。可以使用功能3泄露libc地址,然后功能2递归多次,再使用功能1将canary的值泄露,最后通过爆破随机数,用9011功能来进行栈溢出做ROP。随机数可以直接

2020-07-24 18:24:19 661 1

原创 (ARM PWN里的thumb模式和arm模式的切换)root_me_stack_buffer_overflow_basic

(ARM PWN里的thumb模式和arm模式的切换)root_me_stack_buffer_overflow_basic首先,检查一下程序的保护机制然后,我们用IDA分析一下,栈溢出漏洞在CSU里面有可以利用的gadget,但是直接ret过去,会报invalid instrument错误。这是由于在csu这里的指令是thumb指令,需要将cpu工作状态转移到thumb指令状态才可以执行。标记ARM状态是用CPSR寄存器中的标志位T,BX指令可以设置T位,当BX后面的地

2020-07-24 18:07:42 516

原创 free_spirit(在栈上爆破一个可以被free的fake_chunk)

free_spirit(在栈上爆破一个可以被free的fake_chunk)首先检查一下程序的保护机制然后,我们用IDA分析一下,功能3存在8字节溢出,将会把v7下面的buf指针覆盖掉,而覆盖了buf指针,就能实现任意地址写。那么,我们劫持函数栈返回地址为one_gadget即可,为了绕过结尾对buf的检查,我们的buf非0,且free后不会报错。但是我们泄露不了堆地址,因此,只能在栈上找一个合适的fake_chunk,因此,可以直接在栈上爆破,直到程序不崩溃,那..

2020-07-01 21:18:00 395

原创 已知libc地址爆破TLS、ld.so等地址

已知libc地址爆破TLS、ld.so等地址在大多数情况下,远程的ld.so以及TLS等结构的地址与libc地址之间的偏移与本地的会不一样,但是大致处于一个范围内,并且,在同一个系统里,这个差值是固定的,其差值的变化往往在偏移的第1.5BYTE~2.5BYTE的位置,即地址十六进制的第4、5个数,因此我们只需爆破2个十六进制数即可。以列题来说明BCTF_2018_bugstore在函数中有栈溢出,但是有canary保护我们来看看输入函数,输入函数遇到\0就结束了输入,而我们知道can

2020-07-01 21:07:07 1023

原创 iz_heap_lv1

iz_heap_lv1首先,检查一下程序的保护机制然后,我们用IDA分析一下,delete功能里存在数组下标越界,可以free掉第21个堆指针,而第21个位置对应name的空间因此,我们可以在name里伪造一个chunk,free掉以后后续利用即可。#coding:utf8from pwn import *#sh = process('./iz_heap_lv1')sh = remote('node3.buuoj.cn',29203)libc = ELF('/lib/

2020-07-01 20:51:46 454

原创 ACTF_2019_ACTFNOTE(top chunk上移)

ACTF_2019_ACTFNOTE首先,检查一下程序的保护机制然后,我们用IDA分析一下,edit里存在溢出,可以直接修改top chunk的size那么只需要把top chunk的size修改为-1,然后malloc(负数)即可将TOP chunk向前移动与已有的chunk重叠,然后通过申请空间,控制该程序结构体的指针即可实现任意地址读写。#coding:utf8from pwn import *#sh = process('./ACTF_2019_ACTFNOTE')

2020-07-01 20:46:10 821

原创 large bin attack & house of strom

large bin attack & house of stromlarge bin attack是一种堆利用手法,而house of strom则是在large bin attack的基础上借用unsorted bin来达到任意地址分配,首先我们从源码入手来分析large bin attack原理,然后再讲讲house of strom的原理,接着再看几个题目。为例方便分析,以2.23为例,新版本有tcache的情况类似,只需填满tcache bin绕过tcache即可。在free的时

2020-06-12 00:02:49 1059

原创 de1ctf_2019_unprintable(_dl_fini的l_addr劫持妙用)

de1ctf_2019_unprintable(_dl_fini的l_addr劫持妙用)首先,检查一下程序的保护机制然后,我们用IDA分析一下,存在一个非栈上的格式化字符串漏洞,但是关闭了文件描述符1,导致不能输出,并且printf结束后就调用了exit(0)看看栈里有没有什么可用的数据基本没有,要想劫持printf返回地址进而多次利用,是不行的,因为printf一次性不能实现,即不能修改栈中数据指向printf返回地址后继续利用新得到这个地址取修改printf返回地址,即其不具

2020-06-12 00:02:34 1391

原创 whctf2017_note_sys(多线程条件竞争漏洞)

whctf2017_note_sys(多线程条件竞争漏洞)首先,检查一下程序的保护机制然后,我们用IDA分析一下,delete功能另启了一个线程函数里休眠了2s,在休眠之前,end_ptr减去了8在add函数里,取end_ptr,然后往其指向的地方写一个堆地址。由此,我们可以多次调用delete,每次end_ptr都会减去8并且休眠2s再做判断,这就存在条件竞争,我们可以在判断之前让end_ptr指向got表,然后add的时候就能往got表里写一个堆地址,我们在堆里布下s

2020-06-12 00:02:21 557

原创 jarvisoj_guess(下标越界导致盲注)

jarvisoj_guess(下标越界导致盲注)首先,检查一下程序的保护机制然后,我们用IDA分析一下,转换的时候没有检查flag_hex[2*i]和flag_hex[2*i+1]的值是否向上越界,如果向上越界,我们可以令flag_hex[i]为’0’,而flag_hex[i+1]为p8(offset),这样s[i] = value2 | 16 * value1的值就是value2就是bin_by_hex[flag_hex[2*i+1]]也就是bin_by_hex[offset],那么如果取到上

2020-06-12 00:02:12 376

原创 whctf2017_stackoverflow(glibc任意地址写一个0字节漏洞利用)

whctf2017_stackoverflow(glibc任意地址写一个0字节漏洞利用)首先,检查一下程序的保护机制然后,我们用IDA分析一下输入name的功能可以用于地址泄露在主功能里,存在一个glibc任意地址写入一个0字节的漏洞,我们可以通过malloc一个很大的堆,这样系统调用mmap分配内存,其地址靠近glibc地址,并且偏移固定,这样,我们就能玩glibc里任意地址写一个\x00字节,我们可以劫持_IO_2_1_stdin里的IO_buf_base成员低1字节为\x00,

2020-06-12 00:01:59 771

原创 pwnable_applestore(unlink+局部变量生命周期外引用的漏洞)

pwnable_applestore(unlink+局部变量生命周期外引用的漏洞)首先,检查一下程序的保护机制然后,我们用IDA分析一下,在checkout函数中,如果v1=7174,则把这个函数里的临时节点链接到了链表当中,这就存在了局部变量外部引用的漏洞,通过其他函数,我们可以控制v2节点的内容,进而可以泄露信息等。控制其name指针指向got表,然后调用cart函数即可泄露地址通过伪造其next和prev指针,在delete里,没有free操作,只是一个双向链表的解链操作,

2020-06-12 00:01:47 347

原创 pwnable_dragon(整数溢出+UAF)

pwnable_dragon(整数溢出+UAF)首先,检查一下程序的保护机制然后,我们用IDA分析一下,游戏结束后释放掉了ptr也就是释放掉了v5,而当我们打赢游戏的时候,又malloc(0x10)并输入,然后又调用了v5里面的函数指针,由于v5之前free掉了,所以这里malloc(0x10)并输入,控制的就是v5指向的那块内存,将里面指针指向后面函数即可。现在是如何才能赢得游戏,观察龙的血量,是一个byte而赢得游戏的条件是龙的血量小于等于0Byte的话超过1

2020-06-12 00:01:36 425

原创 [ZJCTF 2019]Mesage(地址值强制当成指令)

[ZJCTF 2019]Mesage(地址值强制当成指令)首先,检查一下程序的保护机制然后,我们用IDA分析一下,在edit功能里没有检查index,可以溢出,在任意地址处写一个堆地址。那么,我们就可以把堆地址写到已存在的堆里,然后调用show就能打印出堆地址,然后,我们计算new的got表到堆地址之间的偏移,将new的got表改为一个堆地址。但是这个堆地址里面开始并不是存放shellcode,而是存放着一个堆指针。通过构造堆,让堆末尾的地址为0xE8,这样,就可以解决问题了,因

2020-06-12 00:01:08 494

原创 arr_sun_2016(从下标上溢跑到下标下溢)

arr_sun_2016(从下标上溢跑到下标下溢)首先,检查一下程序的保护机制然后,我们用IDA分析一下,v2为有符号数,因此,这里存在下标越界的漏洞,但是是向上越界。看似只能向上越界,实际,我们可以利用整数溢出,来达到劫持栈里的返回地址处。列出等式int(ebp+eax*4-0x30) = int(ebp + 0x4)求解得到int(4*eax) = 0x34满足条件的eax有多个,我们取eax=0x8000000D这样,就可以劫持到返回地址处,做rop..

2020-06-11 17:41:44 381

原创 d3ctf_2019_ezfile(文件流fileno的巧妙利用)

d3ctf_2019_ezfile(文件流fileno的巧妙利用)首先,检查一下程序的保护机制然后,我们用IDA分析一下,delete功能存在UAF程序里使用的是write输出,因此劫持IO_2_1_stdout泄露不了数据。Add功能的size固定Encrypt功能存在栈溢出程序一开头有一个这个我们可以利用堆漏洞劫持IO_2_1_stdin,将里面的fileno改为3,然后利用encrypt功能里的栈溢出,采用低字节覆盖法,将返回地址覆盖到此处.

2020-06-11 14:25:41 1017

原创 IEE754 shellcode

IEE754 shellcodefixedpoint_plaid_2016的一题,留着备用https://github.com/ispoleet/ctf-writeups/tree/master/plaid_ctf_2016/fixedpoint#coding:utf8from pwn import *import struct#target = process('./fixedpoint_plaid_2016')target = remote('node3.buuoj.cn',2680

2020-06-11 14:11:24 390

原创 hfctf_2020_sucurebox(0地址引用)

hfctf_2020_sucurebox(0地址引用)首先,检查一下程序的保护机制然后,我们用IDA分析一下,在add功能里,size的判断不准确,导致size可以很大,使得malloc(size)返回0,但是没有检查malloc的返回值然后,edit功能里可以指定offset和len,这样,我们就能在整个内存里进行读写了。#coding:utf8from pwn import *#sh = process('./hfctf_2020_sucurebox')sh = r

2020-06-11 14:02:22 557

原创 ciscn_final_9(null off by one当无法shrink unsorted bin或者控制prev_size时的利用手法)

ciscn_final_9(null off by one当无法shrink unsorted bin或者控制prev_size时的利用手法)首先,检查一下程序的保护机制然后,我们用IDA分析一下,safe_read函数存在一个null off by one漏洞Delete函数里在free之前会清空堆的内容,申请的堆大小是固定的,属于unsorted bin范围从上面看,prev_size无法受我们控制,因为堆的大小为0x100,因此prev_size时0x100的整数倍

2020-06-11 13:51:27 392

原创 ciscn_final_6

ciscn_final_6首先,检查一下程序的保护机制然后,我们IDA分析一下,在store_game函数里的getInput存在null off by one漏洞常规的null off by one漏洞,只是本题逻辑复杂了一点,需要精心构造一下。#coding:utf8from pwn import*#sh = process('./ciscn_final_6')sh = remote('node3.buuoj.cn',27827)libc = ELF('/lib/x8

2020-06-11 13:30:23 384

arm-perl-5.20.1

成功编译了可以在arm平台运行的最新perl5.20.1版本

2014-11-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除