2010년 4월 4일 일요일

blackra1n.exe ASL.dll 오류 해결 방법

해킹아이폰(iPhone 3.1.2 펌웨어)이 자고 일어났더니 먹통이 되서 "blackra1n.exe"을 실행하니 오류가 발생했다.

blackra1n은 iTunes 9.1로 업그레이드 한 상태에서는 "ASL.dll" 오류가 발생한다.

해결방법을 검색을 해서 "blackra1n.exe"을 fix 해봐도, "ASL.dll"을 다운받아봐도 또다른 DLL 오류가 발생한다.

또, 검색... 해서 찾은 방법...

다운받은 "blackra1n.exe"를 "C:\Program Files\Common Files\Apple\Apple Application Support"에 복사한 후 실행

하란다. 가장 간단하게 오류를 해결하는 방법이다.

따라서, 이 방법으로 하면 다른 파일을 다운받을 필요가 없다.

2010년 2월 19일 금요일

g++ 사용시 동적라이브러리 빌드문제 해결

동적라이브러리를 사용해서 프로그램 개발시 gcc로 사용할 때는 문제가 없지만 g++을 사용하면서 문제가 발생하기 시작했다.

 

< 문제 1 >

  • 오류: "dlsym"함수에서 발생하는 "invalid conversion"
  • 해결1:
    • 선언: "int (*func)(char *)"
    • Type casting: "func = (int (*)(char *))dlsym(dl_handle, method);"
  • 해결2:
    • 선언: "void (*fn)(char *, int *);"
    • Type casting: "*(void **)(&fn) = dlsym(dl_handle, "hello1");"

 

< 문제 2 >

  • 오류: 컴파일시 "undefined reference to `dlopen',..." 발생
  • 해결: 컴파일 옵션에 "-ldl" 추가 "g++ -o testdll testdll.cpp -lc -ldl"

 

< 문제 3 >

  • 오류: 컴파일도 잘 끝나고 실행하니... "libhello.so: undefined symbol: hello" 오류 발생
  • 해결: "libhello.cpp"에 extern "C" 선언을 추가
#include "stdio.h"
#include "string.h"

extern "C"
{
	int hello(char *msg);
}

int hello(char *msg)
{
	printf("%s\n", msg);

	return strlen(msg);
}

test_dll.sh

# Build library
if [ -f libhello.o ]; then rm libhello.o
fi
g++ -Wall -fPIC -c libhello.cpp

if [ -f libhello.so ]; then rm libhello.so
fi
g++ -shared -lc -o libhello.so libhello.o

# Build test program
if [ -f testdll.o ]; then rm testdll.o
fi
g++ -Wall -o testdll testdll.cpp -ldl

# Run test program
./testdll

 

그외

  • "nm <object>": 명령어로 오브젝트의 심볼 확인
  • "file filename"

 

참고자료:

  1. toidinamaiblog
  2. 윈도우에서 유닉스로 이식하기, Part 1: C/C++ 이식 (한글)
  3. Static, Shared Dynamic and Loadable Linux Libraries
  4. Writing and Using Libraries

2010년 2월 18일 목요일

리눅스에서 동적라이브러리(DLL) 작성

동적라이브러리(DLL)은 시스템 자원(디스크 및 메모리 공간)을 절약하고, 프로그램의 유지보수를 쉽게하는 장점이 있다.

 

여기서는 특정 어플리케이션을 위한 동적라이브러리 작성 및 사용방법에 대해 알아본다.

 

라이브러리 API 함수는

  • "dlopen" : 메모리에 라이브러리를 맵핑하고 핸들을 리턴
  • "dlsym" : 함수 포인터를 리턴
  • "dlerror" :  오류 문자열 포인터를 리턴, NULL은 정상
  • "dlclose" : 핸들을 닫고 맵핑을 해제

 

동적라이브러리는 "dlopen"에서 절대경로를 설정해서 라이브러리를 지정할 수 있다. 절대 경로가 지정되지 않으면,

  • "LD_LIBRARY_PATH" 환경 변수에서 지정된 경로
  • "/etc/ld.so.cache"의 라이브러리 리스트
  • "/usr/lib"와 "/lib" 경로

 

에서 라이브러리를 찾게 된다. Shell에서 현재 디렉토리를 "LD_LIBRARY_PATH"에 설정하는 것은

export LD_LIBRARY_PATH=`pwd`

이고, pwd를 인용하는 "`"는 TAB 위에 있는 [~/`]키를 사용해야 한다.

 

다음의 libhello.c, testdll.c, test_dll.sh 파일로 동적라이브러리 예제를 작성하고 동작을 확인할 수 있다.

 

libhello.c

#include "stdio.h"
#include "string.h"

int hello(char *msg)
{
	printf("%s\n", msg);

	return strlen(msg);
}

 

testdll.c

#include "stdio.h"
#include "string.h"
#include "unistd.h"
#include "dlfcn.h"

#define _MAX_STRING	80
#define	_LIB_FILE	"libhello.so"

int invoke_method(char *lib, char *method, char *argument)
{
	void *dl_handle;
	int (*func)(char *);
	char *error;
	int ret = 0;

	/* 공유 목적 파일을 연다. */
	dl_handle = dlopen(lib, RTLD_LAZY);
	if (!dl_handle)
	{
		printf("!!! %s\n", dlerror());
		return -1;
	}

	/* 목적 파일에서 심볼(메서드)을 찾는다. */
	func = dlsym(dl_handle, method);
	error = dlerror();
	if (error != NULL)
	{
		printf("!!! %s\n", error);
		return -2;
	}

	/* 찾아낸 메서드를 호출한다. */
	ret = (*func)(argument);

	/* 객체를 닫는다. */
	dlclose(dl_handle);

	return ret;
}

int main(int argc, char *argv[])
{
	char lib[_MAX_STRING+1];
	char method[] = "hello";
	char argument[] = "Hello, library world...";
	char pwd[_MAX_STRING+1];

	getcwd((char *)pwd, _MAX_STRING);
	sprintf(lib, "%s/%s", pwd, _LIB_FILE);

	printf("Result: %d\n", invoke_method(lib, method, argument));
}

 

test_dll.sh

# Build library
if [ -f libhello.o ]; then rm libhello.o
fi
gcc -c -fPIC libhello.c

if [ -f libhello.so ]; then rm libhello.so
fi
gcc -shared -lc -o libhello.so libhello.o

# Build test program
if [ -f testdll.o ]; then rm testdll.o
fi
gcc -o testdll testdll.c -ldl

# Run test program
./testdll

 

참고 자료:

  1. 프로그램 라이브러리 하우투
  2. 리눅스 동적 라이브러리 분석
  3. Linux 애플리케이션을 위한 DLL 작성하기 (한글)

 

2010년 2월 9일 화요일

SSH 포트 변경

SSH 무작위 공격에 대비하기 위해 22번 포트를 변경한다.

$ sudo vi /etc/ssh/sshd_config
# Package generated configuration file
# See the sshd(8) manpage for details

# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to

포트 변경 후

$ sudo /etc/init.d/ssh restart

SSH 서버를 재실행한다.