2011-04-21 3 views
0
char shellcode[] =  "\xeb\x2a\x5e\x89\x76\x08\xc6\x46\x07\x00\xc7\x46\x0c\x00\x00\x00"  "\x00\xb8\x0b\x00\x00\x00\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80"  "\xb8\x01\x00\x00\x00\xbb\x00\x00\x00\x00\xcd\x80\xe8\xd1\xff\xff"  "\xff\x2f\x62\x69\x6e\x2f\x73\x68\x00\x89\xec\x5d\xc3"; 

void main() { 
    int *ret; 
    ret = (int *)&ret + 2; 
    (*ret) = (int)shellcode; 
} 

내 지식으로는 shellcode[]은 쉘을 생성하기위한 16 진수 opcode이며 코드의 마지막 줄이 opcode로 ret를 덮어 씁니다. 우리는 opcode 또는 메모리 주소를 RET에 삽입합니까?EIP/RET? opcode 또는 메모리 주소에 무엇을 삽입합니까?

+2

여기에서 물어 보려는 내용이 전혀 명확하지 않습니다. –

+0

editted ......................... –

+0

실수로 opip 대신 –

답변

0

스택의 ret 레지스터는 코드가 반환되는 위치이며 거기에 opcode를두면 많은 도움이되지 않습니다. 나는 실행하고자하는 코드에 대한 주소가 가장 가능성있는 후보라고 생각합니다. 예! 아마도 상호 작용하는 항목이 사용되는 항목과 데이터를 맹목적으로 덤프하려고하는 대신 사용 방법을 고려하는 것이 가장 좋습니다.

0

그 자체로 주소에 문자열을 삽입합니다. 이 경우에는 완전히 이식성이없고 거의 확실한 나쁜 아이디어라고 지적하는 것은 다소 시간 낭비 일 것입니다 ...

1

반환 연산 코드를 덮어 쓰지 않고 반환 주소를 덮어 씁니다. 스택에 선언 된 변수 근처에 있다고 가정하여 main()이 반환되면 _start+n으로 돌아 가지 않고 대신 shellcode으로 되돌아갑니다.

+0

으로 eip 될 예정입니다. opcode가 응? –