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

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다