드디어 마지막 문제다. 열어보자.
/*
The Lord of the BOF : The Fellowship of the BOF
- dark knight
- remote BOF
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <dumpcode.h>
main()
{
char buffer[40];
int server_fd, client_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
if((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(6666);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero), 8);
if(bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1){
perror("bind");
exit(1);
}
if(listen(server_fd, 10) == -1){
perror("listen");
exit(1);
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &sin_size)) == -1){
perror("accept");
continue;
}
if (!fork()){
send(client_fd, "Death Knight : Not even death can save you from me!\n", 52, 0);
send(client_fd, "You : ", 6, 0);
recv(client_fd, buffer, 256, 0);
close(client_fd);
break;
}
close(client_fd);
while(waitpid(-1,NULL,WNOHANG) > 0);
}
close(server_fd);
}
리모트 BOF 공격에 대한 문제이다..
생전 처음 해보는 리모트 익스플로잇이라;; 소캣부터 다시 공부하고 왔다...
쭉 들여다 보니 recv()함수 쪽에 문제구나.
recv(client_fd, buffer, 256, 0);
buffer로 부터 최대 256byte 복사하도록 설정했는데.
버퍼는 40byte.. 오버플로우가 일어난다. 이부분이 취약점
이 곳을 공략하면 된다.
일단 standalone 서비스이다. (지가 소캣 열고 다하므로..)
standalone은 표준 입출력,에러에 대한 처리가 가능하지 않다.
그래서 bind 셸코드나 reverse 셸코드를 써야한다.
버퍼가 40바이트니까 페이로드를
[nop 44] [ret] [nop] [bind shellcode] 이런 식으로 짜면되겠다.
'IT 그리고 정보보안 > Write-up' 카테고리의 다른 글
Codegate 2013 - Web(100) (0) | 2021.04.12 |
---|---|
Pwnable.kr - fd (0) | 2021.04.12 |
LOB Level 19 (nightmare) (0) | 2021.04.12 |
LOB Level 18 (succubus) (0) | 2021.04.12 |
LOB Level 17 (zombie_assassin) (0) | 2021.04.12 |