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)')
도움된 글