2013-05-26 2 views
2

http://www.cs.wright.edu/people/faculty/tkprasad/courses/cs781/alephOne.html과 같이 스매쉬 스태킹 익스플로잇을 시도하는 동안 스택 포인터를 문자열로 변환해야하는 문제가 발생했습니다.int를 16 진수 형식의 문자열로 변환

(printf를 사용하여) 16 진수 형식으로 int를 출력하는 방법을 알고 있지만 내부 문자열 표현으로 저장하는 방법은 알지 못합니다. 내부적으로 문자열로 저장해야 memcpy 함수에 전달할 수 있습니다.

내가 필요한 이론적 기능은 아래의 "convertFromIntToHexCharStar"입니다.

unsigned long NOPSledPointer = get_sp() + 150; 
char * address = convertFromIntToHexCharStar(NOPSledPointer); 

이 기능을 인수로 사용하기위한 것입니다. 그것은 스택 포인터를 제공합니다.

unsigned long get_sp(void) { 
    __asm__("movl %esp,%eax"); 
} 

나는 * 내가 이런 식으로 방어 적이기을 할 수있는 육각 문자에 스택 포인터를 변환 할 :

char buffer[517]; 

/* Initialize buffer with 0x90 (NOP instruction) */ 
memset(&buffer, 0x90, 517); 

/* Fill the buffer with appropriate contents here */ 
memcpy((void*) buffer, (void*) address, 4); 

내가 진수로 표현 된 주소를 사용하여 메모리에 작성해야 I 때문에 그것이 과거에 효과가 있었다는 것을 알아라.

그래서 내가 문자열을 변환하거나이 NOP 썰매를 수행하는 또 다른 쉬운 방법으로 도움을 요청하고 있습니다. (해결해야 할 실제 문제입니다). 여러 번 주소를 채워서 스택의 반환 주소를 덮어 쓰는 확률을 높였습니다. 그러나 간결함을 위해 "주소"를 "버퍼"에 쓰는 코드 한 줄만주었습니다.

나는 이미 stackoverflow & google을 검색 했으므로 아무 것도 찾을 수 없습니다. 도와 주셔서 미리 감사드립니다.

+1

'sprintf'는'printf'와 같이 작동하지만 그 결과를 문자열에 넣습니다. – Gene

답변

1

snprintf는 스택 포인터의 크기를 4 바이트로 미리 알고 있기 때문에 내 문제를 해결했습니다.

이 사이트

나 도움 : http://www.cplusplus.com/reference/cstdio/snprintf/

을 그리고 여기에 내가 있는지 제대로 작동하기 위해 사용되는 몇 가지 인쇄 문으로, 코드 솔루션 다음과 같습니다.

#include <stdio.h> 

unsigned long get_sp(void) 
{ 
    __asm__("movl %esp,%eax"); 
} 


int main() 
{ 
    unsigned long numberToConvert = get_sp(); 
    char address[9]; 
    snprintf(address, 9, "%08lX", numberToConvert); 

    printf("Number To Convert: %lu \n", numberToConvert); 
    printf("Expected hex number: %08lX \n", numberToConvert); 
    printf("Actual hex number: %s \n", address); 

    return 0; 
} 
관련 문제