nssctf-[HNCTF 2022 Week1]ezcmp

这题比较简单了,主要就是考察你会不会用gdb

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[32]; // [rsp+0h] [rbp-50h] BYREF
  char src[44]; // [rsp+20h] [rbp-30h] BYREF
  unsigned int seed; // [rsp+4Ch] [rbp-4h]

  setbuf(stdin, 0LL);
  setbuf(stderr, 0LL);
  setbuf(stdout, 0LL);
  puts("GDB-pwndbg maybe useful");
  strcpy(src, "Ayaka_nbbbbbbbbbbbbbbbbb_pluss");
  strcpy(buff, src);
  seed = 1;
  srand(1u);
  enccrypt(buff);
  read(0, buf, 0x1EuLL);
  if ( strncmp(buff, buf, 0x1EuLL) )
  {
    puts("Oh No!You lose!!!");
    exit(0);
  }
  return system("/bin/sh");
}

根据反编译后的代码可知只要满足buff=buf就可以getshell

首先我想到的是buff加密前的值是“Ayaka_nbbbbbbbbbbbbbbbbb_pluss”,直接根据加密函数加密后得到密文就行了,仔细观察可以看到加密过程中使用了随机数种子,伪加密,随机数种子给了,那就可以直接得到密文:

b'r@\x0e\xdc\xaaxF\x14\xe2\xb0~L\x1a\xe8\xb6\x84R\xee\xbc\x8aX&\xf4\xc2\x90^,\xcb\xc8\x00\x00'

但是无法直接输入,所以还是要借用pwntools

这里我们也可以用另一种方法,既然要比较buff和buf的内容,那我们可以直接根据buff的地址获取到加密后密文的存储地址

根据IDA可得buff的地址为0x404100

打开gdb进行调试:

 

在puts和read处设置断点

得到密文的存储地址

 编写exp如下:

from pwn import *
p = remote("node5.anna.nssctf.cn",28395)
payload = p64(0x144678aadc0e4072) + p64(0x84b6e81a4c7eb0e2) + p64(0xf426588abcee2052) + p64(0x0000c8cb2c5e90c2)
p.sendlineafter("GDB-pwndbg maybe useful",payload)
print(payload)
p.interactive()

gdb调试命令还是不熟(哭)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值