#0 - 시작하게 된 이유
과제를 하기위해서~~
문제는 과제가 한글로 작성 OTL.. 그래서 한글을 깔려고 결심
하지만 날짜가 지났다고 안된다고 함 ㅜㅜ..
그래서 과제 안하고 이것저것 해결방안 강구....
그러다가 난생 처음 크랙(이라고 하긴 너무 허접하긴해도.. 크랙이니뭐..) 을 하게 되었다....는 그런...........
다시한번,,,, 크랙은 생 전 첨이니깐 고수님들은 자비로운 마음으로 봐주세여...
따로 계획 세우고 한게 아니라서 .. 하다보니깐 이렇게된... 더쉬운 방법도 있는거 같은데..ㅋ
#1 - 삽질의 서장
날짜제한은 "패키지 설치날자 + 60일 내" 는 것을 알아냄.
즉 1월1일날 설치했다면 약 2달 그러니깐 3월 1일까지(인가?) 까지 날짜면 OK!
다시말해서 "적어도 안되고 많아도 안되고 딱 그 내에 유지해야함"
12월 31일이나 3월 3일 같이 범위가 넘어가도 안됨.
결론적으로 시간을 바꿈으로써 날짜제한 회피가 가능
$date -s 2009/1/1/ 이런식으로 사용하면됨,
아니면 쉘스크립트나, C언어로 직접짜도 된다고 한다.. 아직 C로 짜는건 안해보고,
쉘스크립트로 해볼려고 했는데 setuid를 줘도 스크립트 안에 있는 명령어는 user 권한 그대로다
date를 setuid줄까했지만 이건 좀 그런거 같아서 패스
사실 여기까지만 알아도 실행시키는덴 지장이 없겠지만... 뭐 내친김에 끝까지 가보기로 했어여
#2 - 뻘짓... ㅜ
심심해서 strace 툴(프로그램이 사용하는 시스템 콜을 보여준다) 을 써봄
[/usr/lib/haansoft/Common7]$ strace -egettimeofday hwp7
........................
gettimeofday({1240730526, 161906}, NULL) = 0
gettimeofday({1240730526, 263051}, NULL) = 0
[/usr/lib/haansoft/Common7]$
얼핏 gettimeofday 함수가 보임. 저기 나오는 첫번째 인자를 조작할까 해서....
딱보니깐 gettimeofday함수 맨 앞에 1는 유닉스기준초 같고... 2번째는 뭐 timeval 구조체 뭐겠지....
ELF조작(?) 해서 gettimeofday 함수 레이블(??)을 바꿔서 어케하면 될까 생각해봄
근데 ELF가 먼지 함수 테이블이 뭔지 나는 하나도 모르므로 일단 GG..........
#3 - 디버깅툴 ltrace설마해서 ltrace 툴을 사용해봄
이건 해당 프로그램에서 어떤 라이브러리를 사용하는가 보여주는 녀석 같다.
일단 날짜 지났음 새로사삼! 하는 메세지박스가 나온다음에 좀 자세시 출력 한것을 보니 이름이 수상한 녀석 발견!!
그래서 다음과 같이 쳐 보았다
[/tmp]$ ltrace -eHncGetTrialDays hwp7
--- SIGCHLD (Child exited) ---
HncGetTrialDays(0xbfc1a95c, 60, 0x83ab044, 0, 0xb68f1454) = 0
+++ exited (status 0) +++
[/tmp]$ su
암호:
[/tmp]# date -s 2008/12/25
2008. 12. 25. (목) 00:00:00 KST
[/tmp]# ltrace -eHncGetTrialDays hwp7
--- SIGCHLD (Child exited) ---
HncGetTrialDays(0xbf90a64c, 60, 0x83ab044, 0, 0xb67e3454) = 1
+++ exited (status 0) +++
HncGetTrialDays 라는 함수가 있네.. (보기 쉬우라고 조작좀 했다능.. 이해즘.ㅋ... 실제로는 너무 길어서요)
어찌 테스트한 결과
이함수의 Return 값이
0(FALSE) 이면 날짜 지났다는 오류메세지 띄우고,
1(TRUE) 이면 정상적으로 처리해 hwp를 띠워준다는 사실을 알아냄.
결론적으로 강제적으로 수정해서 HncGetTrialDays함수가 무조건 1을 리턴하게 고치면 될것 같다.
아니면 2번째 인자 60의 숫자를 더 늘려준다던가.....근데 귀차너... 쉬운길로 갑시다...
자 이제 이 라이브러리를 수정해야하느데 이함수, 대체 어디다 박힌 놈이야!!?
#4 라이브러리의 위치를 찾아랏!
[/usr/lib/haansoft/Common7]$ alias grp
alias grp='find . -print0 | xargs -0 grep'
[/usr/lib/haansoft]$ grp HncGetTrialDays
Binary file ./Common7/libHncBL70.so matches
Binary file ./HNexcel7/hnexcel7 matches
Binary file ./Hwp7/hwp7 matches
Binary file ./HSlide7/hslide7 matches
[/usr/lib/haansoft]$
공유라이브러리니깐 확장자가 so인녀석
Common7/libHncBL70.so 이 파일이 되겠습니다...
근데.. 이걸 어셈으로 바꿔주는 툴을 또 찾아야겠네요 후...
# 5 위치를 알아보자아! 부트로더 만들때 쪼오끔 건드렸던 ndisasm 이 있었지!!
[/usr/lib/haansoft/Common7]$ ndisasm libHncBL70.so > /tmp/dislib
[/usr/lib/haansoft/Common7]$ vi /tmp/dislib
아 근데 헤더내용도 들어가버린다....
무슨무슨 함수는 어디어디부터 시작한다는게 어딘가 적혀있을텐데..
구글링하니깐 ELF정보를 보면 좀 알수 있을거 같기도 하다??
그래서...
[/usr/lib/haansoft/Common7]$ readelf -a libHncBL70.so >/tmp/b
하니깐 정보는 나오긴하느데 여기서 어케하는겨....
이거 찾으면 되나??? (아래는 /tmp/b 파일에서 HncGetTrialDays문자열만 단순히 찾은겁니다)
407: 0000e564 820 FUNC GLOBAL DEFAULT 10 HncGetTrialDays
저기가 시작점이라는건가?? 에라이 모르겠다.. 감으로 찍어!!!
다시 디스어셈블한 dislib파일로 들어가서..
0000E564 55 push bp
0000E565 89E5 mov bp,sp
0000E567 57 push di
0000E568 56 push si
0000E569 53 push bx
0000E56A 81EC9C12 sub sp,0x129c
0000E56E 0000 add [bx+si],al
0000E570 E8F3E2 call word 0xc866
0000E573 FF db 0xFF
0000E574 FF81C31F inc word [bx+di+0x1fc3]
0000E578 A30400 mov [0x4],ax
0000E57B C645C709 mov byte [di-0x39],0x9
0000E57F C645C808 mov byte [di-0x38],0x8
0000E583 C645C903 mov byte [di-0x37],0x3
............................
일단 push push 하는게 C에서 인자들 넣어주는 삘이 나긴하는데
아 마 도 이게 HncGetTrialDays 본체가 맞는거 같아요
다른함수들 보니깐 다 함수위에 ret도 있고....
저위치에다가 새로운 코드를 덮어씌우면 되겠군요
#6 덮어쓰기자 이제 리턴을 1을 하는 정적 라이브러리를 만들겠습니다아~
그냥 1을 리턴하는 코드 작성~
te.c>>
$ cat > te.c
void a(void)
{
return 1;
}
그다음엔 이걸 정적라이브러리 파일로 만듭니당...
정적 라이브러리 만들면서 ar 명령어는 써봤지만 *.so 파일 만들기는 처음이라 저도 잘 몰라서
http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/library_%B8%B8%B5%E9%B1%E2조인씨에서 copy~ 배껴서 했습니다 귀찮아요...
$ gcc -fPIC -c te.c
$ gcc -shared -W1,-soname,libmysutff.so.1 -o libmysum.so.1.0.1 te.o
쫄을필요 없어요! 우린 저 빨간라인(a함수의 위치) 만 알면 되니까요!!
그리고 저도 오늘 readelf 명령어 처음알았답니다 ㅋㅋ
모르긴 저도 마찬가지.. 다른건 봐도 이해도 안가니깐 일단 빨간색으로 쳐진거만 보기로 했습니다.
$ readelf -a libmysum.so.1.0.1
...................
46: 00000408 0 FUNC GLOBAL DEFAULT 12 _fini
47: 000003bc 10 FUNC GLOBAL DEFAULT 11 a
48: 00001528 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
49: 00001530 0 NOTYPE GLOBAL DEFAULT ABS _end
50: 00001528 0 NOTYPE GLOBAL DEFAULT ABS _edata
51: 00000000 0 FUNC WEAK DEFAULT UND __cxa_finalize@@GLIBC_2.1
52: 000002a0 0 FUNC GLOBAL DEFAULT 9 _init
Histogram for bucket list length (total of 3 buckets):
Length Number % of total Coverage
0 0 ( 0.0%)
1 0 ( 0.0%) 0.0%
2 1 ( 33.3%) 22.2%
3 1 ( 33.3%) 55.6%
4 1 ( 33.3%) 100.0%
Histogram for `.gnu.hash' bucket list length (total of 3 buckets):
Length Number % of total Coverage
0 0 ( 0.0%)
1 1 ( 33.3%) 16.7%
2 1 ( 33.3%) 50.0%
3 1 ( 33.3%) 100.0%
Version symbols section '.gnu.version' contains 10 entries:
Addr: 000000000000023a Offset: 0x00023a Link: 3 (.dynsym)
000: 0 (*local*) 0 (*local*) 0 (*local*) 2 (GLIBC_2.1.3)
004: 1 (*global*) 1 (*global*) 1 (*global*) 1 (*global*)
008: 1 (*global*) 1 (*global*)
Version needs section '.gnu.version_r' contains 1 entries:
Addr: 0x0000000000000250 Offset: 0x000250 Link: 4 (.dynstr)
000000: Version: 1 File: libc.so.6 Cnt: 1
0x0010: Name: GLIBC_2.1.3 Flags: none Version: 2
$
우리가 만든 libmysum.so.1.0.1 에서 함수 a의 시작위치가
000003bc 라는 군요 그럼 글로 가볼까요..(아까 바로 위에서 만든 te.c파일의 a함수의 정적라이브러리상의 위치)
빨간줄로된게 return 1; 부분입니다..
000003BC 55 push bp
000003BD 89E5 mov bp,sp
000003BF B80100 mov ax,0x1
000003C2 0000 add [bx+si],al
000003C4 5D pop bp
000003C5 C3 ret
7 적용!
일단 그래도 연구용(??) 이고...
어짜피 한글 체험판은 기능이 제한적 이라...
기껏해야 날짜 제한 밖에 없어서(??) 공개해 놨긴한데...
그래도 문제된다고 하면 댓글 남겨주세요..