Write-ups/pwnable.xyz
note - pwnable.xyz
dolphinlmg
2020. 2. 11. 23:29
Prob Info
int __cdecl main(int argc, const char **argv, const char **envp)
{
const char *v3; // rdi
int v4; // eax
setup();
v3 = "Note taking 101.";
puts("Note taking 101.");
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
print_menu();
v4 = read_int32(v3);
if ( v4 != 1 )
break;
edit_note();
}
if ( v4 != 2 )
break;
edit_desc();
}
if ( !v4 )
break;
v3 = "Invalid";
puts("Invalid");
}
return 0;
}
void edit_note()
{
int v0; // ST04_4
void *buf; // ST08_8
printf("Note len? ");
v0 = read_int32("Note len? ");
buf = malloc(v0);
printf("note: ");
read(0, buf, v0);
strncpy(s, (const char *)buf, v0);
free(buf);
}
.bss:0000000000601480 public s
.bss:0000000000601480 ; char s[32]
.bss:0000000000601480 s db 20h dup(?) ; DATA XREF: edit_note+67↑o
.bss:00000000006014A0 ; void *buf
.bss:00000000006014A0 buf dq ? ; DATA XREF: edit_desc+4↑r
.bss:00000000006014A0 ; edit_desc+1A↑w ...
힙에 입력한 길이만큼 문자를 받고 s에 strncpy를 이용해 값을 복사한다. 여기서 최대로 복사할 수 있는 값을 우리가 정할 수 있기 때문에 s에서 bof가 일어난다.
ssize_t edit_desc()
{
if ( !buf )
buf = malloc(0x20uLL);
printf("desc: ");
return read(0, buf, 0x20uLL);
}
edit_desc에서는 buf가 0이 아니면 그 주소에 값을 쓸 수 있는데 buf는 우리가 값으로 수정할 수 있으므로 GOT Overwrite가 가능하다.