冒頭に書いた:最近レポートを書く時間がなくて、実験原理はわかったけど、書く時間がない。flag2~4は大胆な発想の通関方法であり、flag5は本格的な通関方法です。後でレポートを書くときは、フラグ 2 ~ 4 の本格的な実験原理と通常の通関方法を再掲します。
学生番号を変更することを忘れないでください。
記事ディレクトリ
キールをインストール
インストールとクラッキングのプロセス:
-
インストール
Keil5
:Next
名前とメールボックスは自由に入力でき、すべてのインストール ドライバを選択する必要があります.インストール パスに中国語を含めないか、直接デフォルトにしないことをお勧めします. -
クラッキング
Keil5
: 新しくインストールしたものを管理者権限で開きKeil5
、表示されるウィンドウを閉じてパッケージをインストールし、クリックしてクラッキング ソフトウェアにFile-License Management
コピーします。CID
クラッキングソフトを入力CID
・設定したら、Generateをクリックして入力ボックスに貼り付けます。をクリックするだけです。(期限切れでも大丈夫です)Target
ARM
Generate
LIC
Keil5
LIC
Add LIC
-
インストール
ARM CMSDK_CM4_FP
: 先生から送られてきたデフォルトのものは、Keil5
私たちが望んでいるものではありませんARM CMSDK_CM4_FP
。ただし、先生からも 2 つの.pack
ファイルが送られてきました。ダブルクリックするだけでインストールできます。インストール パスは、Keil5 のインストール ディレクトリに対応している必要がありNext
ます。
新しいプロジェクトを作成し、ファイルを追加します。
Project-New uVersion Project
、実験ガイドに従って直接構成し、後で直接ガイドに従います。ファイルを直接ドラッグして追加できます。コンパイルするだけですProject-build
。
注: 以前に他のバージョンをインストールして新しいプロジェクトを作成したことがある場合は
Keil
、忘れずにプロジェクト ディレクトリ内のものを削除してください。Listings、Objects、RTE
そうしないと、最初にこれらのディレクトリから構成が自動的に読み込まれ、バージョンが間違っています。
構成項目が完全に正しく、ガイドと完全に一致している場合、0 エラーが直接発生します。エラーを確認します。
次に、Objects/
以下に。次のコマンドを実行して実行します。
~/qemu-7.0.0/build/qemu-system-arm -M mps2-an386 -cpu cortex-m4 -m 16M -nographic -d in_asm,nochain -kernel ~/exp6/task2/task2.axf -D log.txt
注: タスク 2 と 3 の両方で schema を使用しますmps2-an386
。
flag2 と 3
ヘッダー ファイルを追加する手間は、ハードコードされたものを貼り付けます。ヘッダー ファイルを追加する必要はありません。
volatile unsigned int * pCTRL=(volatile unsigned int *)0xE000ED94;
*pCTRL=4;
0xE000ED94
MPU の CTRL アドレスです。
CTRL の割り当ては4
、MPU をオフにすることです。
もう 1 つの方法は、RNR を変更し、MPU を直接切り替えて元のものを役に立たなくすることです。
最新バージョンの lib を使用している場合は、先生が内容を少し更新しました:
最初にヘッダー ファイルを追加します: #include "CMSDK_CM4_FP.h"
,:
for(int i=0;i<8;i++){
MPU->RNR=i;
MPU->RASR&=0xFFFFFFFE;
}
MPU->CTRL=5;
AND 演算の後、MPU の最後のビットは 0 になります。これは、MPU が無効であることを意味します。すべての MPU が無効になっている場合、特権タスクとして、タスクは領域によって制限されません。The Definitive Guide の第 11 章で説明されています。
特権レベルのデフォルトの背景領域は all です。
flag4
StartFreeRTOS(id, vTask3);
上に次の行を追加します。
xTaskCreate( vTask3, "Test3", 100, NULL, ( 1 | ( 0x80000000UL ) ), NULL );
現時点では、誰かが尋ねるでしょう〜なぜこの仕事のラインが可能なのですか?
以前に成功したときは、うまくいくとは思っていませんでしたが、後でレポートを書いたときにプロセスを読んで理解しました。
最初にタスクを作成し、タスク シーケンスに配置してから、StartFreeRTOS を呼び出します。StartFreeRTOS のプロセスは、最初に権限の低い vTask3 タスクを作成し、作成プロセス中に学生 ID の処理を完了するというものです。タスク シーケンスを開始するときに、id の処理の一部もあります。しかし!これらの ID はすべて、タスク シーケンスを開始する前に処理されます。そのため、事前にタスクシーケンスに特権タスクを追加し、印刷関数を呼び出せば印刷は完了します。
ps: タスク シーケンスが並列に実行され、2 番目の制約タスクがハングアップします。電話を切ってください。最初のものはすでにフラグを出力しています。
教師が私のバイパス方法を解決したい場合は、タスク シーケンスの開始後に ID を変更し、フラグの出力速度を遅くする必要があります。または、タスクが正常に完了または返却された後にのみフラグを出力できるという制約を追加します。
vTask3 を変更します。
0x000029A9
axf 逆アセンブリvTaskRemove
(つまり、フラグを出力する関数)のアドレスに 1 を追加することに注意してください。
注: 変更後のコンパイル済み axf の関数アドレスは変更されます。最初にいずれかを埋めてから、この関数のアドレスを逆に見つけます。
flag5
最初に逆方向に、自分のスタック スペースとさまざまな関数のアドレスを確認します。具体的な分析は、実験とまったく同じです。
私の HelperBuffer サイズは 12 で、3 つのレジスタ r1、r2、r3 に対応しています。同様に、サイズが 8 の場合、2 つのレジスタに対応します。具体的な理由は、実際には ida の逆アセンブリの最後の pop 命令に依存し、3 を追加すると 3 になり、2 を追加すると 2 になります。
xPortRaisePrivilege
(権限昇格機能) アドレスは000086E2
.
ただし、最初にプッシュし、プッシュを戻り値として使用するため、ここからは機能しません。そのため、プッシュ命令はスキップしてそこから続行する必要があります000086E4
。
vTaskDelayBackup
(フラグを出力する関数) アドレスは00001C7C
.
学籍番号を入力してください。
長さ 24 (r1,r2,r3,pc+r4,pc)。
入力アドレス (忘れずに 1 を追加):
(関数の r1、r2、r3、pc、権限昇格関数の r4、pc にそれぞれ対応)
4个0 4个0 4个0 e5 86 0 0 4个0 7d 1c 0 0
log.txt で関数と権限エスカレーション関数を見つけて、ポップ後に何が起こるかを確認します。
最初に特権にジャンプしてから、
フラグ関数にジャンプします。