현재접속자(2) : 최근게시물
 
 소개
 세상살이
 공부하세
 떠들어 보세
 추천 사이트

  리눅스 좋아
 
작성일 : 10-04-26 17:20
리눅스용 한글 프로그램 구조 연구
 글쓴이 : 이민우
조회 : 185  
   http://http://lowid.tistory.com/322 [30]
퍼옴.
십수년을 프로그램계에 몸 담고 있어도 모르는게 너무 많다. 쩝!

#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 적용!

Close

 
   
 

Copyright ⓒ 2003 http://www.misari.codns.com. All rights reserved.