ipwn
[Pwnablw.tw] dubblesort 본문
보호기법
모든 보호기법이 다 걸려있음.
분석
int __cdecl main(int argc, const char **argv, const char **envp) { int sort_num; // eax unsigned int *buf_pointer; // edi unsigned int sort_cnt; // esi unsigned int idx; // esi unsigned int content; // ST08_4 int result; // eax unsigned int num; // [esp+18h] [ebp-74h] unsigned int sort_buf[8]; // [esp+1Ch] [ebp-70h] char name[64]; // [esp+3Ch] [ebp-50h] unsigned int canary; // [esp+7Ch] [ebp-10h] canary = __readgsdword(0x14u); set(); __printf_chk(1, "What your name :"); read(0, name, 0x40u); __printf_chk(1, "Hello %s,How many numbers do you what to sort :"); __isoc99_scanf("%u", &num); sort_num = num; if ( num ) { buf_pointer = sort_buf; sort_cnt = 0; do { __printf_chk(1, "Enter the %d number : "); fflush(stdout); __isoc99_scanf("%u", buf_pointer); ++sort_cnt; sort_num = num; ++buf_pointer; } while ( num > sort_cnt ); } sort(sort_buf, sort_num); puts("Result :"); if ( num ) { idx = 0; do { content = sort_buf[idx]; __printf_chk(1, "%u "); ++idx; } while ( num > idx ); } result = 0; if ( __readgsdword(0x14u) != canary ) sub_BA0(); return result; } |
vuln :
기본적으로 그냥 바로 overflow가 발생하는 걸 알 수 있음.
근데 또 name입력 때 uninitialized stack을 통해서 libc leak도 가능.
vector :
scanf가 "%d" 등등의 포맷스트링으로 수를 입력받을 때는 '+'와 같은 연산자를 입력해서 아무 입력을 하지 않을 수 있음.
이를 통해서 머리를 잘 굴리면 system("/bin/sh")가능.
'Write up > Pwnable.tw' 카테고리의 다른 글
[pwnable.tw] kidding 후기 (0) | 2019.05.03 |
---|---|
[Pwnable.tw] calc (0) | 2018.11.02 |
[Pwnable.tw] orw (0) | 2018.11.02 |
[pwnable.tw] start (0) | 2018.11.02 |
Comments