@ㅅㅅㅅ : 보통은 뻘짓하는 애들 때문에 LD_PRELOAD로 후킹한데서 로그로 인자랑 다 때려박아서 남기도록해서 쉘 획득전에 다 막을 수 있음..
codingmon(codingmon)2015-06-17 13:48
쉘 획득이 아니라. mysql 함수에 브레이크포인트 걸어서 스택 상의 값 조사하는 방법으로 웹 서버 데이터베이스 아이디 비번 따냈었음 ㅋㅋㅋ
ㅅㅅㅅ(85.10)2015-06-17 13:48
쉘 획득까지는 내가 간이 작아서 못 했지만 ㅇㅇ.
ㅅㅅㅅ(85.10)2015-06-17 13:49
@ㅅㅅㅅ : 음? 더 이해 안됨..어떤 미친놈이 원격 디버깅 열어 놓음여..-_-;;
codingmon(codingmon)2015-06-17 13:50
@ㅅㅅㅅ : 아..혹시 과제 제출 프로그램이 웹이 아니라 CLI 였음?
codingmon(codingmon)2015-06-17 13:51
아. 우리 학교는 putty로 ssh 접속해서 linux terminal 상에서 작업하걸랑. 그래서 gcc/g++ 같은 거 불러서 작업하는데, gdb 같은 것도 허용되어 있어서. 리눅스 명령어로 교수가 제출 프로그램 코딩해 놓은 거 있었는데 직접 gdb로 그거 디버깅해서 다 까봤음욬ㅋㅋ 한마디로 교수가 허술한 거 맞음.
ㅅㅅㅅ(85.10)2015-06-17 13:52
그럼 이해되네..ㅇㅇ 보통 웹으로 한다.. CLI는 너님 말처럼 너무 공격에 취약해..사실 너님의 그 방법보다는 LD_PRELOAD로 mysql함수 자체를 보는게 인생이 더 편하지;;
codingmon(codingmon)2015-06-17 13:52
뭐 약간 다른 얘기긴 하지만. 어쨌든 나도 과제 채점 서버 뚫어본 경험이 있다는 걸 말하고 싶었.
ㅅㅅㅅ(85.10)2015-06-17 13:52
더블릿이나 백준이나 알고스팟도 저런걸 다막았다고 생각 하니 엄청난 작품들이였군!!
잇힝(121.183)2015-06-17 13:53
@ㅅㅅㅅ : 너님은 프갤에 팬이 많은 ㅅㅅㅅ니까..
codingmon(codingmon)2015-06-17 13:53
@잇힝 : 별거 없엉..원래 기존에 만들어진 것도 많고 from the scratch는 나이들어서 귀찮아서 하기 힘들고
codingmon(codingmon)2015-06-17 13:55
online judge source 든 그런 형태로 검색해보면 많음 아니면 요즘 핫인 github에서 검색해보던지..
어셈으로 뽑아네서 _system _exec같을걸 막으면 될까요?
왜 어셈으로 뽑아 걍 cpp 나 gcc -E 돌리면 되지 않음?
불안해서 전처치된 i파일도 검사하고 어셈도 검사해서 하면 나을까봐 ㅠㅠ
#define 쓰는 방법은 인라인 어셈쓰면 속수무책. 그리고 굳이 API call이 아니라 인라인 어셈에서 direct로 interrupt call할지도 모르는 일이고. 막아야 될 게 산더미.
제일 확실한 건 API hooking으로 sandbox처리하는 게 제일 확실하고 강력할 듯.
장난치는 애들이 맘이 착해서 그렇지 나쁜 맘 먹으면 MBR 파괴도 얼마든지 가능하걸랑.
그냥 아예 C 인터프리터를 새로 짜는 게 낫지 않겠나 싶을 정도.
인라인 어셈을 쓴다면 잇힝말처럼 어셈코드로 뽑아서 막으면 되겠네.
아니지, 그냥 프리프로세스된 C/C++ 코드를 얻는다. 인라인 블럭과 system 을 통째로 날려버린다.
어차피 코드잼에서 인라인 어셈 지원해야할 이유가 없잖아. 플랫폼 중립적인 코드테스트일텐데.
코세 성님 솔루션 보고 떠오른 아이디어인데. 이도저도 귀찮으면 C 파서 짜서 외부 함수 콜이랑 외부 라이브러리 사용은 whitelist 제로 해.
blacklist 제로 가면 막을게 산더미인데 whitelist 제로 하면 허용할만한 함수는 그리 많지 않으니깐.
다만 인라인 어셈 막아도 쉘 코드로 장난질 치는 애들도 생길 듯 ㅎㅎ char code[] = "\\xXX\\xXX\\xXX..."; 식으로 놓고 ((void (*)())code)(); 식으로 말야.
쉘 코드까지 막으려면 일은 엄청 커짐.
쉘 코드의 경우까지 완벽하게 막으려면 답은 후킹 밖에 없어.
쉘 코드 막아도 고의로 버퍼 오버플로 발생시켜서 exploit하려는 애들도 있을 거고.
버퍼 오버플로 체크까지는 어떻게 해도 무리임. 그래서 코드 분석으로는 답 없어. 후킹만이 답임.
인라인 어셈까지는 막을수 있겠는데 쉘코드까지 막아야하는군요 ㅠㅠ
응. 설령 함수 포인터 사용을 금지해서 쉘 코드를 막았다 치더라도 문제는 버퍼 오버플로를 이용해서 공격하는 케이스. 이건 진짜 답 없어.
그 외에 비정상적인 접근 문제는 아니지만 Local DoS 공격을 일으키는 코드도 있을 수 있어서 실행 시간과 자원량에 제한을 두는 게 좋겠다.
엔간해서 제대로 된 Online Judging 시스템 만드는 건 진짜 어렵다. 내가 말한 것들 다 막아야 하니깐.
그나마 제일 강력하면서 간단한 방법이 API Hooking임. 정적 분석으로는 답 없어.
잇힝이 말처럼 어셈블리로도 다시 한번 뽑으면 쉘 코드 막는건 어렵지 않겠네.
데이타영역으로의 실행만 막으면 되잖아.
오늘의 유머: 해킹은 후킹으로 막아야 한다. The king of sun should be guarded with the king of back.
어셈으로 뽑는순간 쉘코드가 실행되버리는거 아닌가요?
아니면, 샌드박스를 하나 돌려서 그 안에서 컴파일하든지.
아니 그냥 컴파일이지 그게 왜 실행돼 ㅋㅋ
그건 글킨 하죠. Data 영역 실행은 DEP 이용하면 막는 건 어렵진 않겠군요.
* DEP(Data Execution Prevention)을 검색해 볼 것.
다만 #pragma 같은 걸로 장난질 치면 Read Write Execute 가능한 section 만드는 건 식은 죽 먹기죠.
이걸 막으려면 아는 게 많아야 함. 공격자가 써볼만한 수는 다 떠올려야 돼.
걍 C 파서 짜서 keyword whitelisting하는 걸 추천.
걍 샌드박스 OS 를 하나 돌리고 거기다 바이너리를 보내 실행하고 죽으면 되살려주는 방법으로 해도 될듯.
일하면서 짬날때 조금씩 만들어 보고 있었는데 일보다 더힘들것네요 ㅠㅠ
#pragma 는 아예 막으면 됨. 쓸일 없음 끽해야 pack 말고는
해커들이 기발해서 뭔 짓을 해서 공격할 지 모름. 만들려는 환경이 윈도우? 리눅스?
윈도우즈 환경인데 gcc 컴파일된걸로 해보고 있었어요
잇힝아 # 막는 것도 indentation 고려해서 # pragma 같은 것도 막아야 하는 건 당삼 알지?
윈도우즈면 Windows API 쓰면 장난질 엄청 칠 수 있겠는걸?
system 쓸 필요가 뭐 있어. 걍 ExitWindowsEx 부르면 시스템 종료인데.
일단 엔터나 스페이스바 탭 다없에서 한번 키워드 다검색해보고 어셈뽑아서 다시 돌리고 그다음 실행 파일 만들고 하려고 했는데 해야할께 산더미,,
그건 헤더랑 라이브러리를 안물려주면 되잖아.
좀 나쁜 마음 먹으면 CreateFile로 "\\\\\\\\.\\\\PhysicalDrive0" 열어서 하드디스크 MBR(부트로더+파티션 테이블) 파괴도 가능.
일단 gcc니까 리눅스 라이브러리만 되서 윈도우즈 api는 신경안써도 될거같으요
뭔솔? gcc도 윈도우용 포팅은 윈도우 API 호출 되는데.
ㅇㅇ
대충 만들다간 컴터 날아가는건 한순간이네 ㅠㅠ
헤더랑 라이브러리만 안물려주면 돼.
가상 os 하나 돌려서 거기서 서비스해. os 파일은 백업해두고
그리고 DEP로 버퍼 오버플로에 의한 Data 영역 코드 실행 막아도 ROP(Return-oriented programming) 방식으로 공격 들어오면 또 속수무책이야. 그래서 ASLR까지 켜 줘야 완벽 방어가 되지.
C 인터프리터 짜는 게 제일 마음 편할 걸. 속도는 느리겠지만.
흉들 너무 무섭다예요..
C 인터프리터 짜는게 몇 배 힘들지...
그냥 LD_PRELOAD 핵이나 jail이나 chroot 아니면 요즘 핫한 LXC든 뭐든 그런 샌드박스로 돌려야한다예요..
그냥 씨로 한번 뽑아 걸러내고 설정 몇가지 하면 지금까지 나온 방법론은 다 막힐듯.
사실 LD_PRELOAD 핵이랑 jail같은 류를 둘 다 쓰는게 가장 좋다예요..
http://hyunmini.tistory.com/55
이런거 보고 LD_PRELOAD 핵을 따라해보도록 해요!
굿 솔루션~
최후의 발악으로 ExitWindowsEx 같은 함수 주소 유추해서 int main(int argc, char *argv[]) { *(&argc; - 1) = 주소; } 할지도 모르는 일.
샌드박스 안에서 하면 어차피 소용없음 윈도도 아님.
뭐 근데 위에서 말했지만 LD_PRELOAD핵만으로는 부족해서 jail이든 chroot같은것도 얹어줘야함. 제대로 하려면..
ㅇㅇ 윈도우에서 돌리는 건 여러모로 위험 부담이 크죠. 리눅스가 진리.
@ㅅㅅㅅ : 샌드박스에서 하면 그런것도 큰 의미없다예요..어차피 본 서버랑은 관련 없는 일이라..
근데 넌 저 해킹 관종한테 왜 자꾸 낚이냐 맨날 사진 올리는 못생긴 애 있잖아.
시스템 자체에 커널 취약점이 있으면 샌드박스도 무용지물이걸랑.
@ㅅㅅㅅ : 윈도우도 걍 VIX API로 스냅샷 떠놓은거 올려놨다가 날리고 해서 샌드박스 구현한다예요..
@ㅅㅅㅅ : 아..가끔 취약점 이용해서 호스트로 올라가는 경우도 있긴한데..그건 뭐..
ㅅㅅㅅ 야 샌드박스로는 미니 리눅스 커널을 올릴수 있잖아.
그건 글쵸. 암튼 리눅스가 진리 ㅋㅋ
실제로 이번에 VirtualBox가 그런 경우가 있긴했군화..근데 그건 매우 드문데 이해해주세염..
리눅스도 어차피 가끔 그런 취약점 올라오긴 한다뇨..
저 관종한테 밥주지마 ㅡ,.ㅡ 제목만 봐도 쟤인거 티나는데.
@codesafer : 코세흉도 계속 밥 주고 있는거 아닌가요..ㅋㅋㅋ
아니 난 밥안줌 ㅋㄷ 굶기기 모드 들어간지 며칠 됨
정신이 아득해진다 온라인 져지 사이트가 그냥 만드는게 아니였군 ㅠㅠ
응. 적어도 후킹은 해야 돼. 백준 온라인 저지는 후킹인지 샌드박스인진 모르겠지만 C/C++ 외에도 다른 언어에서도 파일 함수나 외부 통신 함수는 죄다 막아놨더라. 시스템 콜 자체를.
@잇힝 : 이게 걍 온라인 져지면 그래도 낫지..숙제 채점 서버라고 생각해보셈..
내가 몇 번 뚫어보려고 시도했걸랑 ㅋㅋㅋ
@잇힝 : 실행 데이터나 다른 사람 소스 뺄라고 뻘짓거리하는 애새끼들 엄청 많음
뭔가 더 쉬운 마스킹 방법이 있을것 같다.
난 대딩 1학년 1학기 때 전공 C언어 과목 숙제 채점 서버 제출 프로그램 gdb로 까서 분석해서 관리자 비밀번호하고 소스 어디에 저장되는지 싹 다 까봤던 추억이 새록새록 ㅋㅋㅋ
시험 끝나고 다른 애들 시험 어떻게 풀었나 몰래 다른 교실가서 염탐했음. 내가 못 풀어서가 아니라 다른 애들 점수 어떻게 나오는지 보고 순위 내보려고 ㅇㅇ
@ㅅㅅㅅ : 어차피 시스템 콜이라도 LD_PRELOAD면 됨. 다른 언어라면 사실 시스템 콜단에서 막았다기보다는 걍 어차피 걔들도 glibc같은거 동적 링킹되어 있을테니까. LD_PRELOAD로 막았을듯..
@ㅅㅅㅅ : ㅇㅇ 조교가 너님같은 애들을 엄청 싫어합니다. 근데 쉘 획득까지 되다니 그쪽 제출서버도 참..;;
@ㅅㅅㅅ : 보통은 뻘짓하는 애들 때문에 LD_PRELOAD로 후킹한데서 로그로 인자랑 다 때려박아서 남기도록해서 쉘 획득전에 다 막을 수 있음..
쉘 획득이 아니라. mysql 함수에 브레이크포인트 걸어서 스택 상의 값 조사하는 방법으로 웹 서버 데이터베이스 아이디 비번 따냈었음 ㅋㅋㅋ
쉘 획득까지는 내가 간이 작아서 못 했지만 ㅇㅇ.
@ㅅㅅㅅ : 음? 더 이해 안됨..어떤 미친놈이 원격 디버깅 열어 놓음여..-_-;;
@ㅅㅅㅅ : 아..혹시 과제 제출 프로그램이 웹이 아니라 CLI 였음?
아. 우리 학교는 putty로 ssh 접속해서 linux terminal 상에서 작업하걸랑. 그래서 gcc/g++ 같은 거 불러서 작업하는데, gdb 같은 것도 허용되어 있어서. 리눅스 명령어로 교수가 제출 프로그램 코딩해 놓은 거 있었는데 직접 gdb로 그거 디버깅해서 다 까봤음욬ㅋㅋ 한마디로 교수가 허술한 거 맞음.
그럼 이해되네..ㅇㅇ 보통 웹으로 한다.. CLI는 너님 말처럼 너무 공격에 취약해..사실 너님의 그 방법보다는 LD_PRELOAD로 mysql함수 자체를 보는게 인생이 더 편하지;;
뭐 약간 다른 얘기긴 하지만. 어쨌든 나도 과제 채점 서버 뚫어본 경험이 있다는 걸 말하고 싶었.
더블릿이나 백준이나 알고스팟도 저런걸 다막았다고 생각 하니 엄청난 작품들이였군!!
@ㅅㅅㅅ : 너님은 프갤에 팬이 많은 ㅅㅅㅅ니까..
@잇힝 : 별거 없엉..원래 기존에 만들어진 것도 많고 from the scratch는 나이들어서 귀찮아서 하기 힘들고
online judge source 든 그런 형태로 검색해보면 많음 아니면 요즘 핫인 github에서 검색해보던지..
how-does-the-acm-icpc-online-judge-prevent-malicious-attacks
대개 codingmon 이 이야기한대로 chroot jail + libc 패치를 이야기 하네.
so/questions/1014505/저 키워드