콘텐츠로 건너뛰기

python3에서 nop sled 넣을시 0x90c2.. 꼴로 나오는 경우

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)')

도움된 글

https://stackoverflow.com/questions/43477337/how-to-fix-gdb-probable-charset-issue-nop-0x90-translating-to-0x90c2-in-memory

답글 남기기