티스토리 뷰
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밖에 주어지지 않았다.
그래서 ret에 system함수를 이용하여 쉘을 띄우기로 했다.
우선, 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 4byte를 nop로 채운 뒤, ret에 system함수의 주소를 넣고 nop 4byte를 채운 뒤 /bin/sh의 주소를 넣어 공격을 하였다.
'SYSTEM > bof' 카테고리의 다른 글
LEVEL6 (wolfman -> darkelf) : check length of argv[1] + egghunter + bufferhunter (0) | 2013.07.19 |
---|---|
LEVEL5 (orc -> wolfman) : egghunter + bufferhunter (0) | 2013.07.19 |
LEVEL4 (goblin -> orc) : egghunter (0) | 2013.07.19 |
LEVEL3 (cobolt -> goblin) : small buffer + stdin (0) | 2013.07.19 |
LEVEL1 (gate -> gremlin) : simple bof (0) | 2012.11.23 |
- Total
- Today
- Yesterday