-
note - pwnable.xyzWrite-ups/pwnable.xyz 2020. 2. 11. 23:29
Prob Info
Prob Info Checksec 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가 가능하다.
'Write-ups > pwnable.xyz' 카테고리의 다른 글
two targets - pwnable.xyz (0) 2020.02.12 xor - pwnable.xyz (0) 2020.02.11 GrownUp - pwnable.xyz (0) 2020.02.11 misalignment - pwnable.xyz (0) 2020.02.11 add - pwnable.xyz (0) 2020.02.11