gdb-peda$ r <<< $(python3 -c 'print("\x90" * 128)') Starting program: /home/ubuntu/Desktop/awesome-basics/chall <<< $(python3 -c 'print("\x90" * 128)') Your Input: Program received signal SIGSEGV, Segmentation fault. [----------------------------------registers-----------------------------------] ... RSI: 0x7fffffffe300 --> 0x90c290c290c290c2 RDI: 0x90c290c2 RBP: 0x90c290c290c290c2 RSP: 0x7fffffffe368 --> 0x90c290c290c290c2 ... 0x5555555553e9 <main+250>: call 0x555555555110 <close@plt> 0x5555555553ee <main+255>: mov eax,0x0 0x5555555553f3 <main+260>: leave => 0x5555555553f4 <main+261>: ret 0x5555555553f5: add BYTE PTR [rax],al 0x5555555553f7: add bl,dh 0x5555555553f9 <_fini+1>: nop edx 0x5555555553fc <_fini+4>: sub rsp,0x8 [------------------------------------stack-------------------------------------] 0000| 0x7fffffffe368 --> 0x90c290c290c290c2 0008| 0x7fffffffe370 --> 0x90c290c290c290c2 0016| 0x7fffffffe378 --> 0x90c290c290c290c2 ... [------------------------------------------------------------------------------] Legend: code, data, rodata, value Stopped reason: SIGSEGV 0x00005555555553f4 in main ()
위와 같이 0x909090.. 꼴이 나오지 않고 c2라는 값이 들어가는데
여기서 “\x90c2″는 UTF-8 문자 U+0090의 16진수 인코딩이다.
Python 2는 문자열을 바이트 배열로 처리하지만, Python 3는 UTF-8로 인코딩된 문자의 배열로 처리하기 때문이라고 한다.
따라서 아래와 같이 sys.stdout.buffer.write를 이용하면 해결된다.
gdb-peda$ r <<< $(python3 -c 'import sys; sys.stdout.buffer.write(b"\x90" * 128)')
도움된 글