셸코드 질문입니다

조회수 919회
#include <stdio.h>
char shell[] = "\x78\x56\x34\x12";
int main(){
  float p1;
  int *p2;
  p2 = (int*)&p2 + [  빈칸   ];
  (*p2) = (int)shell;

빈칸에 들어갈수 있는 코드가 뭐가 있을까요?

1 답변

  • 쉘코드 테스트 코드같은데요 32 크로스 컴파일했는데 wsl 에서는 실행이 안되는거 같네요 그래서 코드 수정했서요 ( compile option : -fno-stack-protector )

    안하면 마지막에 ret 에 eax 로 넣다보니 0x7fff가 남아서 정상적으로 rip 조작이 안되서요 ㅎㅎ

    간단하게 말하면 [ ret sfp p1 p2 ] 이 있으니. p2 기준에서 +@ 해서 ret의 주소값을 p2에 박고 p2가 가리키는 위치에 shellcode를 넣으면 됩니다.(만약 canary 가 있으면 카나리 범위도 계산해야합니다.)

    char shell[] = "\x87\x65\x43\x21";
    int main(){
            float p1=0x1;
            long *p2;
            p2 = (int *)&p2 + 5 + (long)(*p2) ;
            (*p2) = (long)shell;
            return 0;
    }
    
    [----------------------------------registers-----------------------------------]
    RAX: 0x0
    RBX: 0x0
    RCX: 0x8000640 --> 0x41d7894956415741
    RDX: 0x8201010 --> 0x21436587
    RSI: 0x7ffffffee048 --> 0x7ffffffee267 ("/home/howoni/qqt")
    RDI: 0x1
    RBP: 0x8000640 --> 0x41d7894956415741
    RSP: 0x7ffffffedf70 --> 0x1
    RIP: 0x8201010 --> 0x21436587
    R8 : 0x7fffff3ecd80 --> 0x0
    R9 : 0x7fffff3ecd80 --> 0x0
    R10: 0x0
    R11: 0x3
    R12: 0x80004f0 --> 0x89485ed18949ed31
    R13: 0x7ffffffee040 --> 0x1
    R14: 0x0
    R15: 0x0
    EFLAGS: 0x10202 (carry parity adjust zero sign trap INTERRUPT direction overflow)
    [-------------------------------------code-------------------------------------]
       0x820100a:   and    BYTE PTR [rax],cl
       0x820100c:   add    BYTE PTR [rax],al
       0x820100e:   add    BYTE PTR [rax],al
    => 0x8201010 <shell>:   xchg   DWORD PTR [rbp+0x43],esp
       0x8201013 <shell+3>: and    DWORD PTR [rax],eax
       0x8201015 <completed.7698>:  add    BYTE PTR [rax],al
       0x8201017:   add    BYTE PTR [rax],al
       0x8201019:   add    BYTE PTR [rax],al
    [------------------------------------stack-------------------------------------]
    ...생략...
    Legend: code, data, rodata, value
    Stopped reason: SIGSEGV
    0x0000000008201010 in shell ()
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)