본문 바로가기

카테고리 없음

Lord of Bof bugbear to giant 야매풀이

일단 소스는 이렇습니다.




네. 의도대로라면 execve를 이용해서 풀어야겠지만, 풀이가 꼭 하나일 필요는 없으니까요!


한번 따져보죠.

execve는 일단 user mode에서는 별다른 메모리 연산을 안하고 커널로 넘어갑니다.

대충 소스가 이렇단말이죠.

int execve(char *path, char **argv, char **envp) {
    syscall(__NR_execve, path, argv, envp); // go to kernel!
}

커널에서 메모리 에러가 날 경우라도 일반적으로는 EBADADDR을 리턴하기만 하고, 딱히 크래시가 나거나 그렇진 않죠. (난다면 커널 버그로 신고하거나 공격코드까지 만들어서 버그를 요란하게 제보해봅시다)


그렇기 때문에!

1. execve의 인자는 아예 신경쓰지 않고

2. 어차피 오류가 나면 그 함수가 크래시 안나고 리턴은 할테니까

3. 리턴주소에 system을 넣습니다!

그리고 그냥 system으로 RTL하듯이 페이로드를 거기서부터 구성해주죠.

그럼 끝!


[AAAAAAAA...] [execve] [system] [system ret: 0x41414141] [/bin/sh]


요래도 된답니당. system ret이 execve의 첫 번째 인자로 들어가긴 하지만 그 부분이 접근 가능한 메모리 주소인지, 올바른 실행 파일 경로인지는 커널에서 체크해주니까 딱히 신경쓸 필요 없어요. 크래시가 안나거든요.