Wargame & CTF/HackCTF
[HackCTF / pwnable] Yes or no
cg10036
2019. 10. 5. 17:48
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax int v4; // eax int v5; // ecx int v6; // eax int v7; // eax char s; // [rsp+Eh] [rbp-12h] int v10; // [rsp+18h] [rbp-8h] int v11; // [rsp+1Ch] [rbp-4h] setvbuf(stdout, 0LL, 2, 0LL); v11 = 5; puts("Show me your number~!"); fgets(&s, 10, stdin); v10 = atoi(&s); if ( (v11 - 10) >> 3 < 0 ) { v4 = 0; } else { v3 = v11++; v4 = v10 - v3; } if ( v4 == v10 ) { puts("Sorry. You can't come with us"); } else { v5 = 1204 / ++v11; v6 = v11++; if ( v10 == v6 * v5 << (++v11 % 20 + 5) ) { puts("That's cool. Follow me"); gets(&s); } else { v7 = v11--; if ( v10 == v7 ) { printf("Why are you here?"); return 0; } puts("All I can say to you is \"do_system+1094\".\ngood luck"); } } return 0; } | cs |
번호를 입력받고 그 번호가 조건에 맞으면 s에 입력을 받는다.
puts로 puts.got를 출력하고 그 출력된 값으로 libc의 base를 구한다.
다시 메인으로 돌려서 이번에는 oneshot gadget+libc base를 ret에 덮어 씌운다.
조건이 잘 맞는다면 쉘이 뜰것이다.
일단 번호부터 구해보자. 나는 angr로